C++ 循环依赖 : What should the constructor look like?

标签 c++ circular-dependency

我通读了很多循环依赖主题,但它们似乎都与声明有关。我对如何构建相互依赖的对象以及我的方法是否存在潜在缺陷感兴趣。考虑这个简单的例子:

#include <iostream>
#include <vector>
using namespace std;

class A; //Forward declaration

class B{
    public:
        B(string name, A* a):myA(a), name(name){
            cout << "Works with pointer" << endl;
        };
    private:
        A* myA;
        string name;

};

class A{
    public:
        A(){
            cout << "Constructing A" << endl;
            if(bs.empty()) cout << "Vector is empty" << endl;
            bs.push_back(B("First", this));
            cout << "Array has " << bs.size() << " elements." << endl;
        };
    private:
        std::vector<B> bs;
};


int main() {
    cout << "Start" << endl;
    A a;
    cout << "Ok." << endl;
    return 0;
}

我可以做些什么来避免 B 中的 A* 指针?

理想情况下我想要一个引用,但是如果我将 B 的构造函数更改为 B(string name, A& a) 然后将 push_back 更改为 bs.bush_back(B("First", *this)); 我得到一个错误:非静态引用成员'A& B::myA',不能使用默认赋值运算符See the modified example

据我所知,编译器合成的 operator= 不适合放在这里。正确的 operator= 会是什么样子?还是我一起走错了方向?

最佳答案

当您在标准容器中使用类型时,例如 vector,类型需要是 CopyConstructibleAssignable。如果您的类型具有指针成员,那么这些成员可以与隐式定义的复制赋值运算符一起正常工作,但引用成员的情况并非如此,因为引用不能被重新绑定(bind)。

如果您希望您的类型在容器中工作,坚持使用指针成员要简单得多。您是否可以定义在您的特定情况下有意义的复制赋值运算符并不明显,通常情况下并非如此。

关于C++ 循环依赖 : What should the constructor look like?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6704237/

相关文章:

mysql - 如何解决两个表之间的循环引用?

compiler-errors - 需要C++/CLI中循环依赖的解决方案(编译器错误)

c# - 同一程序集中的循环引用是一件坏事吗?

c++ - 循环 C++ 头文件包括

c++ - 将文件中的数据读取到类的数组中

c++ - 如何使用异步库实现忙碌信号?

c++ - 最佳实践 : src/include or include folder next to src folder

node.js - 使用 requirejs 解决 Node 中的循环依赖

c++ - 通过 MAPI 读取 Exchange 服务器时间

c++ - 由于 WTTlog.DLL 导致的运行时错误?