2017-01-28 2 views
0

Пожалуйста, помогите мне понять источник этой ошибки - я не могу сказать, если это код или настройки для 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
  • ошибка: год не был объявлен в этой области.

Если код никогда не работал вообще, я бы усложнил свои инструменты, но почему он копирует его в отдельные файлы, дает мне эту ошибку?

ответ

1

Вам необходимо включить iostream либо Birthday.cpp или Birthday.h. Во-вторых, определение printDate должно быть ограничено классом: Birthday::printdate.

+0

очень полезно - спасибо. Потому что я пытаюсь научиться, а не просто попросить ответа (и я еще не знаю, как правильно отобразить printDate), можете ли вы объяснить, как: он находится в пределах объема, как было изначально написано, т. Е. Не нуждается в «дополнительном» scope, и, что еще более важно, Как его переместить в отдельный файл, но со всем неповрежденным кодом вывести его из области видимости? – whatshisface

+0

@whatshisface С определениями функций-членов вы должны сообщить компилятору, что они являются частью класса. В противном случае это обычные функции C-стиля. Это то, что делает оператор '::' вместе с помещением имени класса перед ним. Он работал в первом примере, потому что вы ввели определение внутри объявления класса. –

+0

Ах !!! ясность! Спасибо: 0) Я подумал, что было бы важно правильно понять это. Немного проб и ошибок, но я нашел ответ. Не сделал бы это без таких полезных подсказок: 0) – whatshisface

Смежные вопросы