首页 > 解决方案 > 如何让多个对象共享值?

问题描述

我在 C++ 中有多个同一类的对象。该类有一些变量,实际代码有点复杂,所以假设只有一个:int iMyAge. 在正常情况下,我希望它们具有单独的值——显然,就像对象已经做到的那样。但我也希望能够链接两个独立对象的两个变量,例如,让对象 1 自动采用对象 2 的变量int iMyAge

我试过用公共变量来做这件事,并有两个指针指向我想在对象之间链接的变量。一个是对象的值,另一个是应该使用值的指针。所以我有int * iMyAgeint * iFollowAge我会:

  1. 如果我想使用对象的变量作为指针,设置iFollowAgeiMyAge
  2. 如果我想使用该对象的值,则设置iFollowAge为其他对象的 iMyAge 指针

在代码中,*iFollowAge如果我想获取我当前感兴趣的年龄(对象自己的“年龄”或它链接到的其他对象的年龄),并且* iMyAge如果我想访问或更改对象自己的“年龄”。

但是我用这种方法遇到了分段错误,虽然这是我能想到的最优雅的解决方案,但我对使用公共变量犹豫不决,因为它被认为是不好的做法。

关于为什么会发生这种情况或什么是替代解决方案的任何想法?

标签: c++objectpointerssegmentation-fault

解决方案


你可以用std::shared_ptr这个。

#include <iostream>
#include <memory>

class ThingThatHasInt
{
protected:
    std::shared_ptr<int> myInt;

public:
    ThingThatHasInt (int i) : myInt (std::make_shared<int>(i))
        { ; }

    int getInt() const
        { return *myInt; }

    void setInt(int i)
        { *myInt = i; }

    void marry(ThingThatHasInt const& other)
        { myInt = other.myInt; }

    void divorce()
        { myInt = std::make_shared<int>(*myInt); }
};

int main()
{
    ThingThatHasInt a(10), b(20);
    std::cout << "a=" << a.getInt() << ", b=" << b.getInt() << std::endl;
    b.setInt(5);
    std::cout << "a=" << a.getInt() << ", b=" << b.getInt() << std::endl;
    a.marry(b);
    std::cout << "a=" << a.getInt() << ", b=" << b.getInt() << std::endl;
    b.setInt(20);
    std::cout << "a=" << a.getInt() << ", b=" << b.getInt() << std::endl;
    a.setInt(30);
    std::cout << "a=" << a.getInt() << ", b=" << b.getInt() << std::endl;
    b.divorce();
    std::cout << "a=" << a.getInt() << ", b=" << b.getInt() << std::endl;
    a.setInt(40);
    std::cout << "a=" << a.getInt() << ", b=" << b.getInt() << std::endl;
    b.setInt(50);
    std::cout << "a=" << a.getInt() << ", b=" << b.getInt() << std::endl;
}

推荐阅读