Я хочу реализовать ассоциацию 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
Эта конкретная ситуация перекрестных ссылок может быть обработана несколькими способами.
Предполагая, что вы не можете просто позволить 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, но это не похоже на ваш случай.
Вам нужно будет заранее объявить классы:
хиджры:
class B;
class A {
public:
// methods
private:
B* b_obj;
};
B.h
class A;
class B {
public:
// methods
private:
A* a_obj;
};
Какие операторы включения у вас есть для каждого файла? Из того, что у вас есть, похоже, что предварительная декларация будет работать для вас.
// 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;
};