агрегация — Как реализовать ассоциацию в переполнении стека

Я хочу реализовать ассоциацию I C ++, но получаю несколько ошибок и не могу их решить.

Class A{

public: //methods
private:
B * b_obj;

};

Class B{
public: //methods
private:
A * a_obj;
}

Оба эти класса находятся в отдельных файлах. то есть A.h, A.cpp, B.h а также B.cpp,
VS2012 дает ошибки
Ошибка C2061: синтаксическая ошибка около A

1

Решение

Эта конкретная ситуация перекрестных ссылок может быть обработана несколькими способами.

Предполагая, что вы не можете просто позволить A.h включить B.h, а B.h включить A.h, поскольку при включении заголовков не более одного раза один будет включаться всегда раньше другого, самое простое решение — просто использовать прямые ссылки:

хиджры

class B;

class A {
B* bObj;
}

a.cpp

#include "A.h"#include "B.h"
...

B.h

class A;

class B {
A* aObjM;
}

B.cpp

#include "B.h"#include "A.h"
...

Это простое решение не позволяет вам использовать A спецификации в B.h (например, вызов метода) и наоборот, и при этом он не позволяет хранить конкретные экземпляры (A против A*) в классе B, но это не похоже на ваш случай.

1

Другие решения

Вам нужно будет заранее объявить классы:

хиджры:

class B;

class A {
public:
// methods
private:
B* b_obj;
};

B.h

class A;

class B {
public:
// methods
private:
A* a_obj;
};
2

Какие операторы включения у вас есть для каждого файла? Из того, что у вас есть, похоже, что предварительная декларация будет работать для вас.

// A.h
#includes without B.h

class B;

class A {
public:
// whatever

private:
B * b_obj;
};

// B.h
#includes without A.h

class A;

class B {
public:
// whatever

private:
A *a_obj;
};
0
По вопросам рекламы [email protected]