LINUX.ORG.RU

C++ expected class-name before ‘{’ token


0

0

Не выходит наследоватся:

=== a.hpp ===
#ifndef a_hpp
#define a_hpp

#include "b.hpp"

class A { };

#endif

=== a.cpp ===
#include "a.hpp"

=== b.hpp ===
#ifndef b_hpp
#define b_hpp

#include "a.hpp"

class B : public A { };

#endif

=== b.cpp ===
#include "b.hpp"


Выбивает:
In file included from a.hpp:4,
from a.cpp:1:
b.hpp:6: ошибка: expected class-name before ‘{’ token

Это я так понял из-за того что один файл включает другой, который в свою очередь опять же включает первый.... :/

как побороть?

anonymous

Не включать b.hpp в a.hpp

svu ★★★★★
()

Во первый, тебе действительно нада из a.hpp включать b.hpp? Если прям так сильно нужно, то убери это и в a.cpp включай b.hpp

st0ke
()
Ответ на: комментарий от st0ke

Ах, столкнулся с другой проблемой.
Уже как неделя я разбираюсь с include )))

И так: есть 3 класса: A, B, C.

A зависит от B,
B зависит от C,
C наследуется от B

http://img213.imageshack.us/img213/6374/25354464jw5.png
Не знаю правильно ли нарисовал...

===<a.cpp>===
#include "a.hpp"
===<a.cpp/>===

===<a.hpp>===
#ifndef a_hpp
#define a_hpp

#include "b.hpp"

class A {
private:
B * b;
};

#endif
===<a.hpp/>===

===<b.cpp>===
#include "b.hpp"
===<b.cpp/>===

===<b.hpp>===
#ifndef b_hpp
#define b_hpp

#include "c.hpp"

class C;

class B {
private:
C * c;
};

#endif
===<b.hpp/>===

===<c.cpp>===
#include "b.hpp"
#include "c.hpp"
===<c.cpp/>===

===<c.hpp>===
#ifndef c_hpp
#define c_hpp

class B;

class C : public B { };

#endif
===<c.hpp/>===

http://filekeeper.org/download/shared/example.tar.bz2

$ g++ a.cpp b.cpp c.cpp -fPIC -shared
In file included from b.hpp:4,
from a.hpp:4,
from a.cpp:1:
c.hpp:6: ошибка: invalid use of incomplete type ‘struct B’
c.hpp:4: ошибка: forward declaration of ‘struct B’
In file included from b.hpp:4,
from b.cpp:1:
c.hpp:6: ошибка: invalid use of incomplete type ‘struct B’
c.hpp:4: ошибка: forward declaration of ‘struct B’
In file included from b.hpp:4,
from c.cpp:1:
c.hpp:6: ошибка: invalid use of incomplete type ‘struct B’
c.hpp:4: ошибка: forward declaration of ‘struct B’

Возможно ли вообще такое провернуть, когда один зависит от другого и т.д. Рекурсия словом.

?

anonymous
()
Ответ на: комментарий от anonymous

В a.hpp и b.hpp не нужно ничего включать.

В c.hpp хорошим стилем будет включить b.hpp, а не полагаться на то что в .cpp включит b.hpp до c.hpp

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

Наконец-то понял.

И так разкажу, может кому пригодиться:

1. Не включать в .hpp никаких других заговолочный файлов! Только в .cpp, а то проблем не оберетесь.
2. Порядок в .cpp: сначало свой .hpp потом все необходимые .hpp, напр. если a.cpp, то: 
#include "a.hpp" // наш класс
#include ... // другие классы
#include ... // другие классы

3. Не используйсте реализацию в .hpp!!! Только в .cpp. А то выходит что он пока что не знает про объект и ругается, напр.

class B {
   public:
      B();
      ~B();

//      void myTest ( void ) { this -> c -> test(); } // НЕПРАВИЛЬНО.
      void myTest ( void ); // ПРАВИЛЬНО
   private:
      C * c;
};

// ПРАВИЛЬНО
void B::myTest ( void ) {
   this -> c -> test();
}

4. Если вводиться новое пространство имен, то объявляем так:


namespace defaultNameSpace {
   namespace newNameSpace { // объявляем класс в новом пространстве. Обявить как class newNameSpace::someClass не прокатит.
      class someClass;
}
...
}

ну вот вроде и все.... неделя не зря прошла )))
Надеюсь кому-то пригодиться.
Премного благодарен всем за помощь!

anonymous
()
Ответ на: комментарий от anonymous

> 1. Не включать в .hpp никаких других заговолочный файлов! Только в .cpp, а то проблем не оберетесь.

неправильное решение

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

>>В a.hpp и b.hpp не нужно ничего включать.

>> 1. Не включать в .hpp никаких других заговолочный файлов! Только в .cpp, а то проблем не оберетесь.

>неправильное решение

Почему? У меня как раз после это проблема и решилась. Я имею ввиду заголовочные файлы других классов, а не стандартной библиотеки C++

>>В a.hpp и b.hpp не нужно ничего включать.

А включать нужно в .cpp

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.