当 class B 是 C++ 中 class A 的成员时,我在 class B 中访问 class A 的 public 成员的正确方法是什么?

What is the correct way for me to access a public member of class A in class B when class B is a member of class A in C++?

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

我写了一个示例代码。它无法编译(错误消息: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);
}

提前感谢您分享知识。

当您使用前向声明时,您需要确保任何需要完整类型的前向声明类型的使用发生在该类型被完全定义之后。

在您的情况下,这意味着您的代码应该如下所示:

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

cObj = new B(*this);
您可以在此处使用 B,因为它尚未定义。 把这个放在B的定义下:

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

并删除内联定义。

    cObj = new B(*this);

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

class A { ... };

class B { ... };

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