Пожалуйста, помогите мне понять источник этой ошибки - я не могу сказать, если это код или настройки для IDE. Хотя вопросы «вне сферы действия» очень распространены, я искал ответы, но ничего не нашел, что помогает.Попытка устранить «из сферы» компиляции ошибок: CodeBlocks, Linux Fedora
Я после C++ курс в Интернете по адресу SoloLearn. В дополнение к их предложению я загрузил и настроил Codeblocks в Linux, чтобы я мог следовать курсу, написав код и компилируя его внутри IDE, а не просто через браузер через окно браузера. Все было хорошо до сих пор: 0/
Итак, я следую уроку о «композиции» и (снова следуя их предложениям) разбил свой код и создал отдельные файлы для определения конструкторов/классов. Тем не менее, несмотря на то, что я верю, что делаю все правильно, я продолжаю получать эту ошибку «вне сферы действия».
Вот их код, написанный на одной странице. Если скопировать и вставить в IDE, как единый файл компилируется успешно, и мое выбран терминал всплывает окно с ожидаемым выходом:
#include <iostream>
using namespace std;
class Birthday {
public:
Birthday(int m, int d, int y)
: month(m), day(d), year(y)
{ }
void printDate()
{
cout<<month<<"/"<<day <<"/"<<year<<endl;
}
private:
int month;
int day;
int year;
};
class Person {
public:
Person(string n, Birthday b)
: name(n), bd(b)
{ }
void printInfo()
{
cout << name << endl;
bd.printDate();
}
private:
string name;
Birthday bd;
};
int main() {
Birthday bd(2, 21, 1985);
Person p("David", bd);
p.printInfo();
}
То, что я сейчас делаю, это удалить первое определение конструктора в отдельный .h
и .cpp
файлы, например:
#ifndef BIRTHDAY_H
#define BIRTHDAY_H
class Birthday
{
public:
Birthday(int m, int d, int y);
void printDate();
private:
int month;
int day;
int year;
};
#endif // BIRTHDAY_H
и
#include "Birthday.h"
using namespace std;
Birthday::Birthday(int m, int d, int y)
: month(m), day(d), year(y)
{ }
void printDate()
{
cout<<month<<"/"<<day <<"/"<<year<<endl;
}
Все, что я делаю, я очищено, повторно запустить файлы проекта. Я удалил и воссоздал их. Я перезагрузился. Но каждый раз, когда я пытаюсь строить, я получаю следующее:
- ошибка: соиЬ не был объявлен в этой области
- ошибка: месяц не был объявлен в этой области
- ошибка: день не был объявлен в этой scope
- ошибка: год не был объявлен в этой области.
Если код никогда не работал вообще, я бы усложнил свои инструменты, но почему он копирует его в отдельные файлы, дает мне эту ошибку?
очень полезно - спасибо. Потому что я пытаюсь научиться, а не просто попросить ответа (и я еще не знаю, как правильно отобразить printDate), можете ли вы объяснить, как: он находится в пределах объема, как было изначально написано, т. Е. Не нуждается в «дополнительном» scope, и, что еще более важно, Как его переместить в отдельный файл, но со всем неповрежденным кодом вывести его из области видимости? – whatshisface
@whatshisface С определениями функций-членов вы должны сообщить компилятору, что они являются частью класса. В противном случае это обычные функции C-стиля. Это то, что делает оператор '::' вместе с помещением имени класса перед ним. Он работал в первом примере, потому что вы ввели определение внутри объявления класса. –
Ах !!! ясность! Спасибо: 0) Я подумал, что было бы важно правильно понять это. Немного проб и ошибок, но я нашел ответ. Не сделал бы это без таких полезных подсказок: 0) – whatshisface