我遇到了使用循环依赖进行编译的问题。我做了一些研究,人们建议使用前瞻性声明。我仍然遇到问题,因为具有前向声明的类正在使用转发类中的方法。这会导致编译器给出错误“A类具有不完整的字段b”。如何解决A需要B的循环依赖,B需要A?
A.H:
#ifndef A_H_
#define A_H_
#include <iostream>
//#include "B.h"
class A
{
class B;
private:
B b;
public:
A();
~A();
void method();
};
#endif
A.cpp:
#include <iostream>
#include "A.h"
A::A()
{
}
A::~A()
{
}
void A::method()
{
b.method();
}
B.h:
#ifndef B_H_
#define B_H_
#include <iostream>
//#include "A.h"
class B
{
class A;
private:
A a;
public:
B();
~B();
void method();
};
#endif
B.cpp:
#include <iostream>
#include "B.h"
B::B()
{
}
B::~B()
{
}
void B::method()
{
a.method();
}
答案 0 :(得分:7)
你的课程无法运作。每个A
都包含一个B
,其中包含A
,其中包含B
等无限广告。
答案 1 :(得分:3)
在至少一种情况下(A
或B
),您必须删除对完整类型的依赖。例如,下面我删除了A
在B
头文件中包含完整类型A.h
的需要:
// A.h
class B;
// B used as a reference only, so the complete type
// is not needed at this time
class A
{
public:
A(B& b) : b_(b) {}
void method();
private:
B& b_;
};
// A.cpp
// B is used, and the complete type is required
#include "B.h"
void A::f()
{
b.method();
}
答案 2 :(得分:3)
这不会有效,因为您构建它A
需要B
的完全知识,而B
需要{{1}的相同内容只有通过查看完整的声明才会给出。
以下内容无效:
A
为什么呢?我们为class B;
class A {
B b;
};
的实例分配了多少空间? A
但是有一种解决方法:
sizeof(A) = sizeof(B) = undefined
这是完全有效的,因为指针和引用的大小是已知的,无论它们指向何种类型。
答案 3 :(得分:2)
您可以尝试用指向另一个类的指针替换其中一个成员:
class B;
class A
{
private:
B* b;
public:
A();
~A();
void method();
};