c++ - 如何让多个对象共享值?
问题描述
我在 C++ 中有多个同一类的对象。该类有一些变量,实际代码有点复杂,所以假设只有一个:int iMyAge
. 在正常情况下,我希望它们具有单独的值——显然,就像对象已经做到的那样。但我也希望能够链接两个独立对象的两个变量,例如,让对象 1 自动采用对象 2 的变量int iMyAge
。
我试过用公共变量来做这件事,并有两个指针指向我想在对象之间链接的变量。一个是对象的值,另一个是应该使用值的指针。所以我有int * iMyAge
,int * iFollowAge
我会:
- 如果我想使用对象的变量作为指针,设置
iFollowAge
为iMyAge
- 如果我想使用该对象的值,则设置
iFollowAge
为其他对象的 iMyAge 指针
在代码中,*iFollowAge
如果我想获取我当前感兴趣的年龄(对象自己的“年龄”或它链接到的其他对象的年龄),并且* iMyAge
如果我想访问或更改对象自己的“年龄”。
但是我用这种方法遇到了分段错误,虽然这是我能想到的最优雅的解决方案,但我对使用公共变量犹豫不决,因为它被认为是不好的做法。
关于为什么会发生这种情况或什么是替代解决方案的任何想法?
解决方案
你可以用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;
}
推荐阅读
- java - 在 if 语句中比较 d 的更好方法。如果我需要将其与 100 个值进行比较怎么办?
- javascript - 如何使用浏览器中的提示验证多个 OTP?
- mongodb - 如何在 mongoDB 中加入数据库并获取所需的结果
- javascript - 由于 json 导致 Ajax 表单无法正常工作(引发的解析器错误:SyntaxError: JSON.parse: unexpected end of data at line 1 column 1 of the JSON data)
- swift - swift mapkit 当前位置
- oracle-sqldeveloper - .SQL 文件在 Oracle SQL Developer 中打开为空白
- vue.js - VuePress - Algolia 增加结果
- spring - 在 Spring 项目中将 .htaccess 文件放在哪里?
- html - Bootstrap - 如何正确重新定位我的下拉菜单?
- objective-c - CVMetalTextureCache 应该多久刷新一次?