Зависимости нескольких классов - PullRequest
0 голосов
/ 20 июня 2011

Я пытаюсь создать класс, который содержит два других объекта, и этот объект должен поддерживать указатель на класс, в котором они содержатся. Для

Например ... (Я использую только объектпеременная экземпляра, в последнем представлении есть класс, очень похожий на ClassB)

Это просто мой main.cpp, подумал, что я бы включил его, чтобы быть тщательным ...

//Filename: main.cpp
#include "ClassA.hpp"

int main(int argc, char **args) {
    ClassA *a = new ClassA();
    // There would be some more here in the real code
    return 0;
}

Теперь о классах в вопросах ....

//Filename: classA.hpp
#ifndef CLASSA_H
#define CLASSA_H

#include "ClassB.hpp"

class ClassA {
public:
    ClassA() {
        b = new B(this);
    };
    virtual ~ClassA();

private:
    ClassB *b;
};

#endif //CLASSA_H

Теперь вот другой файл ...

#ifndef CLASSB_H
#define CLASSB_H

#include "ClassB.hpp"

//Filename: classB.hpp
class ClassB {
public:
    ClassB(ClassA *parent) {
        this->parent = parent;
    };
    virtual ~ClassB();
private:
    A *parent;
};

#endif //CLASSB_H

Когда я пытаюсь скомпилировать это, я получаю ошибку "ошибка: ClassA не называет тип ", а затем, конечно," ошибка: ожидается ")" до '*' токена "Мне кажется, это как-то связано с ними, включая друг друга?

(Не уверен, что это важно, но в реальном коде реализации функций находятся в файле .cpp, который содержит заголовок. Будет ли это делать?)

Ответы [ 3 ]

3 голосов
/ 20 июня 2011

Я предполагаю, что это опечатки, но я могу ошибаться classA, пока у вас есть A *.

Что вам нужно сделать, так это объявить классы вперед, т.е.

class ClassA;
class ClassB{
    ...
};

и то же самое для ClassA

class ClassB;
class ClassA{
      ....
};
1 голос
/ 20 июня 2011

Вы можете сделать это одним из двух способов; либо вы можете заставить ClassA и ClassB реализовывать интерфейс (или суперкласс, поскольку вы находитесь в C ++), а затем указывать для каждого класса указатель в качестве интерфейса. Второй способ сделать это - использовать предварительное объявление перед каждым классом (т.е. предварительное объявление ClassA перед определением прямого объявления ClassB и ClassB перед определением ClassA).

1 голос
/ 20 июня 2011

Добавить

class ClassA;

до определения ClassB; Простой пример:

class B;

class A {
        B * b;
};

class B {
        A * a;
};

int main(int argc, char ** argv) {
        return 0;
}
...