прямое объявление с вектором типа класса - указатель на неполный тип класса не допускается

У меня есть два класса, foo и bar .

foo.h #include s bar.h и содержит std :: vector указателей на объекты bar . В какой-то момент во время выполнения bar должен получить доступ к этому вектору указателей на другие объекты bar . Следовательно, foo содержит метод с именем getBarObjects () , который возвращает массив указателей.

Поэтому я пересылаю объявление foo в bar.h. Я, очевидно, также должен переслать объявление метода, который я использую - foo :: getBarObjects () . Поскольку это возвращает массив указателей на бар , я попадаю в порочный круг.

Я не могу пересылать объявление Bar, а затем просто пересылать объявление getBarObjects () , так как это приводит к «недопустимому неполному имени типа».

foo.h:

#include "bar.h"
#include <vector>

class foo {
    public:
         foo();
         ~foo();
         std::vector<bar*> getBarObjects();
    private:
         std::vector<bar*> barObjects;
}

bar.h:

class foo;
std::vector<bar*> foo::getBarObjects();        // error, doesn't know bar at this point

class bar {
    public:
        bar(foo *currentFoo);
        ~bar();
        bool dosth();
    private:
        foo *thisFoo;
}

bar.cpp:

#include "bar.h"

bool bar(foo *currentFoo) {
    thisFoo = currentFoo;
}

bool bar::dosth() {
    thisFoo->getBarObjects();        // error, pointer to inomplete class type is not allowed
}

Если я просто включу наоборот, у меня будет та же проблема в foo позже на. Есть предложения?

11
задан Fabio says Reinstate Monica 20 November 2018 в 17:13
поделиться