破坏循环依赖

时间:2013-11-25 20:07:58

标签: c++ c++11

我遇到了使用循环依赖进行编译的问题。我做了一些研究,人们建议使用前瞻性声明。我仍然遇到问题,因为具有前向声明的类正在使用转发类中的方法。这会导致编译器给出错误“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();
}

4 个答案:

答案 0 :(得分:7)

你的课程无法运作。每个A都包含一个B,其中包含A,其中包含B等无限广告。

答案 1 :(得分:3)

在至少一种情况下(AB),您必须删除对完整类型的依赖。例如,下面我删除了AB头文件中包含完整类型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();
};