如何在 C++ 中将更改从一个 class 传播到另一个?

How to propagate changes from one class to another in C++?

有这个代码:

#include <iostream>
#include <vector>
#include <string>

class A{
public:
    A(std::string const& name) : name(name) {}
    std::string const& getName() const {
        return name;
    }
private:
    std::string name;
};

class B{
public:
    void add(A const& a){
        //vec.emplace_back(a) does not help either
        vec.push_back(a);
    }
    std::vector<A> const& getVec() const {
        return vec;
    }
private:
    std::vector<A> vec;
};

class C{
public:
    C(B const& b, A const& a) : a(a), b(b) {}
    A const& getA() const {
        return a;
    }
    B& getB() {
        return b;
    }

private:
    A a;
    B b;
};

class D{
public:
    C& add(C& c){
        A const& a = c.getA();
        B& b = c.getB();

        b.add(a);
        vec.push_back(c);
        return c;
    }
private:
    std::vector<C> vec;
};

int main(){
    A a1{"first"};
    A a2{"second"};

    B b;

    C c1{b, a1};
    C c2{b, a2};

    D d;
    d.add(c1);
    d.add(c2);

    for(A const& a : b.getVec()){
        std::cout << a.getName() << ' ';
    }
}

程序没有输出,但是

我希望输出:

first second

其中 B class 持有矢量,D 试图通过 class [=16= 修改它 (c.getB().add()) ].这只是一个简单的例子(在学校项目中遇到),但我想通过这个例子了解 classes.

之间的变化流程

C 的成员不是引用类型。 c1c2 都存储构造函数参数的副本。

所以

d.add(c1);
d.add(c2);

不影响 main 中的 b,仅影响 c1c2 的成员,它们是原始 b 的副本,a1a2main.