C ++ циклическая ссылка, ошибка при использовании методов, даже после объявления о пересылке - PullRequest
1 голос
/ 08 ноября 2011

Предположим, у меня есть:

class B;
class A{
    private:
        B *b;
    public:
        bar(){ b->foo()};
        foo();
}

class B{
    private:
        A *a;
    public:
        bar(){ a->foo();}
        foo();
}

При компиляции этот файл дает

ошибка "неверное использование неполного типа struct B",

даже после того, как я заранее объявил класс B. Насколько я понимаю, это потому, что когда я вызываю функцию foo() на b, компилятор все еще не знает, что такая функция существует. Как я могу решить эту проблему?

Ответы [ 3 ]

10 голосов
/ 08 ноября 2011

В предварительной декларации нет подробностей реализации. B неизвестно A, кроме того факта, что оно существует.

Для решения этой проблемы отделите вашу декларацию от реализации.

Вам также не хватает типов возвращаемых данных для методов.

Файл A.h:

class B;
class A{
    private:
        B *b;
    public:
        void bar();
        void foo();
};

Файл A.cpp:

#include "A.h"
#include "B.h"
void A::bar(){ 
   b->foo();
}

Файл B.h:

class A;
class B{
    private:
        A *a;
    public:
        void bar();
        void foo();
};

Файл B.cpp:

#include "B.h"
#include "A.h"
void B::bar(){ 
   a->foo();
}
1 голос
/ 08 ноября 2011

Ошибка в том, что вы пытаетесь использовать метод из B в A::bar.Хотя класс B был объявлен , он не был определен .

Как и другие говорят, вы должны разделить определение и реализацию, и это будетработа.

1 голос
/ 08 ноября 2011

Поместите реализацию в исходный файл, а не в заголовок.

...