2014-09-18 2 views
0

просто получает странную ошибку, и я не совсем уверен, почему.Класс-указатель как элемент данных другого объекта

У меня есть 4 файла (два заголовка и две реализации). Вопрос находится внутри заголовков:

Главный файл ТОЛЬКО включает в себя Station.h, поэтому Stations.h входит в него.

Station.h

#ifndef STATION_H 
#define STATION_H 
#include "Stations.h" 

#include <string> 

enum PassType{student, adult}; 

class Station{ 

     std::string station_name; 
     unsigned int student_passes; 
     unsigned int adult_passes; 

    public: 
     Station(); 
     void set(const std::string&, unsigned, unsigned); 
     void update(PassType, int); 
     unsigned inStock(PassType) const; 
     const std::string& getName() const; 

}; 


#endif 

Stations.h

#ifndef STATIONS_H 
#define STATIONS_H 
#include "Station.h" 

namespace w2{ 

    class Stations{ 

    Station *station; 

    public: 
     Stations(char *); 
     void update() const; 
     void restock() const; 
     void report() const; 
     ~Stations(); 

    }; 

} 

#endif 

Он не знает, что станция находится. Я получаю следующую ошибку:

./Stations.h:9:2: error: unknown type name 'Station'; did you mean 'Stations'? 
     Station *station; 

Что именно я здесь не хватает? Я не самый сильный разработчик на C++, так голый со мной, пожалуйста.

+0

Есть ли более одного файла с именем Station.h, и вы ошибаетесь? В каких пространствах имен? – dlf

+0

Существуют ли строки '# ifdef' для предотвращения множественного включения? Пожалуйста, включите все содержимое файлов. –

+0

@ R Sahu - В обоих заголовках есть. – Kris

ответ

0

Вы #include ING Stations.h в Station.h. В результате компилятор видит class Stations до class Station. В этом случае не представляется, что Station требует Stations, поэтому вы можете просто удалить include.

Если Stationсделал нужно знать о Stations, то вам придется использовать опережающее объявление в одном из заголовков или других (и быть осторожными, чтобы не использовать прямую объявленную класс таким образом, что требуется полное определение).

+0

Получил! Не обращайте внимания на мой последний комментарий. Огромная опечатка! Спасибо огромное! – Kris

0

Не забудьте поставить точку с запятой после объявления класса станций:

class Stations { 
    Station *station; 
}; 
0

U нужно сделать опережающее объявление. Удалите #include "Stations.h" от Station.h

#ifndef STATIONS_H 
#define STATIONS_H 
#include "Station.h" 

namespace w2{ 
    class Station; 
    class Stations{ 

    Station *station; 

    public: 
     Stations(char *); 
     void update() const; 
     void restock() const; 
     void report() const; 
     ~Stations(); 

    }; 

} 

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