2013-11-13 2 views
18

У меня есть два класса на тот же .cpp, как что:ошибка: доступ к члену в неполный тип: прямую декларация

//forward 
class B; 

class A {  
    void doSomething(B * _b) { 
     _b->add(); 
    } 
}; 

class B { 

    void add() { 
     ... 
    } 

}; 

Форвард не работает, я не могу скомпилировать.

Я получил эту ошибку:

error: member access into incomplete type 'B' 
note: forward declaration of 'B' 

Я использую лязг компилятор (лязг-500.2.79).

Я не хочу использовать несколько файлов (.cpp и .hh), я хотел бы закодировать только один .cpp.

Я не могу написать класс B до класса А.

У вас есть какие-либо идеи для решения моей проблемы?

С уважением.

+3

Переместить тело функции 'A :: doSomething' после определения' class B'. – dyp

+1

Я говорю об этом в потоке: «Я не могу написать класс B перед классом A.». Я использую пример кода для объяснения моей проблемы. В моем реальном коде у меня есть указатель на мой класс B в моем классе A. Итак, если я напишу класс B перед классом A, проблема будет такой же! – LOLKFC

+0

Следует избегать имен, начинающихся с подчеркивания, таких как '_b'. Они могут использоваться библиотекой компилятора/стандарта в глобальном пространстве имен; кроме того, вы должны ** никогда не использовать идентификаторы, начинающиеся с символа подчеркивания, за которым следует буква в верхнем регистре, например '_B' (также зарезервировано). – dyp

ответ

15

Move doSomething определения вне своего класса декларации и после B, а также сделать add доступными до A по public -в его или friend -в его.

class B; 

class A 
{ 
    void doSomething(B * b); 
}; 

class B 
{ 
public: 
    void add() {} 
}; 

void A::doSomething(B * b) 
{ 
    b->add(); 
} 
+0

Спасибо. Я действительно не знаю, почему я не нашел это решение раньше ... – LOLKFC

+4

Имел аналогичную проблему. Я забыл включить заголовок (из другого класса) в .cpp – Volte

6

Вы должны иметь определение класса B, прежде чем использовать этот класс. Как иначе компилятор знал бы, что существует такая функция, как B::add?

Либо определить класс B перед классом A или переместить тело A::doSomething к после того, как класс B был определен, как

class B; 

class A 
{ 
    B* b; 

    void doSomething(); 
}; 

class B 
{ 
    A* a; 

    void add() {} 
}; 

void A::doSomething() 
{ 
    b->add(); 
} 
Смежные вопросы