C++循环依赖:构造函数应该是什么样的?

seb*_*ger 1 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;
}
Run Code Online (Sandbox Code Playgroud)

我能做些什么来避免A*指针进入B

理想情况下我想有一个引用,但如果我更改Bto 的构造函数B(string name, A& a)然后将push_back更改为bs.bush_back(B("First", *this));我得到一个错误:non-static reference member 'A& B::myA', can't use default assignment operator.请参阅修改后的示例

据我所知,operator=这是由编译器合成的,不适合这里.适当的operator=样子怎么样?或者我一起走错了方向?

CB *_*ley 5

在标准容器中使用类型时,vector类型需要是CopyConstructibleAssignable.如果您的类型具有指针成员,那么这些将适用于隐式定义的复制赋值运算符,但引用成员不是这种情况,因为引用无法反弹.

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