当B类是C ++中A类的成员时,访问B类中A类的公共成员的正确方法是什么?

时间:2018-08-09 17:43:45

标签: c++ class pointers function-pointers

在下面的示例中,我希望能够访问函数cList中类B中的向量ShareData。我该怎么办?

我已经编写了示例代码。它无法编译(错误消息:B没有构造函数)。即使这样做,行cObj = new B(*this);是否引入了任何循环依赖关系?

#include "stdafx.h"
#include <vector>

class B;

class A
{
public:
    B* cObj;
    std::vector<B*> cList;
    A()
    {
        cObj = new B(*this);
    }
};

class B
{
public:
    B(A& aObj) : aObjLocal(aObj) {};
    void ShareData(int result)
    {
        for (auto& iterator : aObjLocal.cList)
        {
            (*iterator).ShareData(result);
        }
    }
private:
    A& aObjLocal;
};


void main()
{
    A aMain;
    B bMain(aMain);
    bMain.ShareData(10);
}

预先感谢您分享知识。

3 个答案:

答案 0 :(得分:2)

在使用正向声明时,需要确保在完全定义类型之后对需要完整类型的正向声明类型进行任何使用。

对于您而言,这意味着您的代码应如下所示:

class B;

class A
{
public:
    B* cObj;
    std::vector<B*> cList;
    A();
};

class B {
   ...
};

inline A::A()
{
    cObj = new B(*this);
}

此外,您当然希望摆脱拥有B*,而在那儿使用std::unique_ptr

答案 1 :(得分:1)

cObj = new B(*this);
您尚未在此处使用B,因为尚未定义。 将其放在B的定义下:

A::A()
{
    cObj = new B(*this);
}

并删除内联定义。

答案 2 :(得分:1)

    cObj = new B(*this);

A的构造函数中不起作用,因为B的定义在该行不可见。定义A后,移动B的构造函数的实现。

class A { ... };

class B { ... };

inline A::A()
{
    cObj = new B(*this);
}