复制一个对象并使两者共享一个成员变量(C++)

复制一个对象并使两者共享一个成员变量(C++),c++,class,copy-constructor,member-variables,C++,Class,Copy Constructor,Member Variables,我一直在思考和寻找这个问题,但我无法解决这个问题。 我想要一个对象,当复制到另一个对象时,两个对象共享某个成员变量。所以,当我更改object1的成员变量的值时,它也会更改object2中的变量。例如: class ABC { public: int a = 5; //... } int main() { ABC object1; ABC object2 = object1; object2.a = 7; // now, object1.a

我一直在思考和寻找这个问题,但我无法解决这个问题。 我想要一个对象,当复制到另一个对象时,两个对象共享某个成员变量。所以,当我更改object1的成员变量的值时,它也会更改object2中的变量。例如:

class ABC {
public:
    int a = 5;
    //...
}

int main() {
    ABC object1;

    ABC object2 = object1;

    object2.a = 7;      // now, object1.a is equal to 7
    object1.a = 10;     // now, object2.a is equal to 10
}
我知道复制构造函数,但我不确定它是否适用于这里或那里 更好的方法。我一直在考虑使用指针或引用,但没有成功。
请注意,我不希望所有对象共享同一个变量。

您需要的是指针。指针指向对象,然后复制第一个指针的所有对象都复制指针,以便它们都指向同一个对象。为了让生活更轻松,我们可以使用a来为我们管理分配和解除分配。比如:

#include <memory>

class Foo
{
private:
    std::shared_ptr<int> bar;
public:
    Foo() : bar(std::make_shared<int>()) {}
    int& getBar() { return *bar; }
};

int main()
{
    Foo a;
    a.getBar() = 7;
    Foo b = a;
    b.getBar() = 10;
    // now getBar returns 10 for both a and b
    Foo c;
    // a and b are both 10 and c is 0 since it wasn't a copy and is it's own instance
    b = c;
    // now b and c are both 0 and a is still 10
}

你需要的是一个指针。指针指向对象,然后复制第一个指针的所有对象都复制指针,以便它们都指向同一个对象。为了让生活更轻松,我们可以使用a来为我们管理分配和解除分配。比如:

#include <memory>

class Foo
{
private:
    std::shared_ptr<int> bar;
public:
    Foo() : bar(std::make_shared<int>()) {}
    int& getBar() { return *bar; }
};

int main()
{
    Foo a;
    a.getBar() = 7;
    Foo b = a;
    b.getBar() = 10;
    // now getBar returns 10 for both a and b
    Foo c;
    // a and b are both 10 and c is 0 since it wasn't a copy and is it's own instance
    b = c;
    // now b and c are both 0 and a is still 10
}

如果希望该类的所有对象共享同一个变量,则可以将其设置为静态。如果只希望这两个共享变量,并且使用复制构造函数或赋值操作符来传递连接,则可以使用共享指针变量。在C++中,如果使用复制构造函数共享这些数据,则在多个实例之间共享对数据的引用将破坏复制语义。也就是说,当您复制某个副本时,它们应该完全不相交,以便更改一个副本不会影响另一个副本。这一点很重要,因为编译器理解复制语义,并在优化代码时使用它。关于这一点,你可能想看看Sean Parent在YouTube上的一些谈话。也就是说,你可以考虑一个工厂功能,比如UnQuyJPTR CytHealSeadCopristABC和ITECOTCOPE,这样读者就知道这不是一个合适的副本。编译器不会像复制构造函数那样对待这个函数。@TimJohns这是错误的。在不同对象之间共享公共引用既不会破坏复制语义,也不会妨碍编译器优化。例如,如果我想共享一个const-large\u-data\u结构&它在相似的对象之间是相同的,这将更快地避免所述对象的不必要副本。也就是说,当您复制某个对象时,它们应该完全不相交,以便更改一个副本不会影响另一个副本。一般来说,这是一种良好的做法,但如果不这样做是可以接受的,甚至更好,那么情况就已经足够了。这一点很重要,因为编译器理解复制语义,并在优化代码时使用它。从技术上讲,这是正确的,但最终会产生误导;与引用或指针共享数据不会降低编译器优化代码的能力。如果希望此类的所有对象共享同一个变量,可以将其设置为静态。如果只希望这两个共享变量,并且使用复制构造函数或赋值操作符来传递连接,则可以使用共享指针变量。在C++中,如果使用复制构造函数共享这些数据,则在多个实例之间共享对数据的引用将破坏复制语义。也就是说,当您复制某个副本时,它们应该完全不相交,以便更改一个副本不会影响另一个副本。这一点很重要,因为编译器理解复制语义,并在优化代码时使用它。关于这一点,你可能想看看Sean Parent在YouTube上的一些谈话。也就是说,你可以考虑一个工厂功能,比如UnQuyJPTR CytHealSeadCopristABC和ITECOTCOPE,这样读者就知道这不是一个合适的副本。编译器不会像复制构造函数那样对待这个函数。@TimJohns这是错误的。在不同对象之间共享公共引用既不会破坏复制语义,也不会妨碍编译器优化。例如,如果我想共享一个const-large\u-data\u结构&它在相似的对象之间是相同的,这将更快地避免所述对象的不必要副本。也就是说,当您复制某个对象时,它们应该完全不相交,以便更改一个副本不会影响另一个副本。一般来说,这是一种良好的做法,但如果不这样做是可以接受的,甚至更好,那么情况就已经足够了。这一点很重要,因为编译器理解复制语义,并在优化代码时使用它。从技术上讲,这是正确的,但最终会产生误导;与引用或指针共享数据不会降低编译器优化代码的能力。谢谢,这正是我所需要的。现在我知道该去哪里找了。这很好。请记住,这里的默认赋值运算符将导致目标开始共享源的条形图并忘记abo
ut其旧的共享对象,而不是复制值;如果这不是你想要的行为,你需要写一个赋值运算符谢谢,这就是我需要的。现在我知道该去哪里找了。这很好。请记住,这里的默认赋值运算符将导致目标开始共享源的条形图,并忘记其旧的共享对象,而不是复制值;如果这不是期望的行为,则需要编写赋值运算符