gpt4 book ai didi

c++ - 更改一个对象的引用并且它会更改集合中的所有对象

转载 作者:太空狗 更新时间:2023-10-29 23:17:43 25 4
gpt4 key购买 nike

我创建了 Person 类,它是 Account 类的成员,然后是 Bank 类,其中包含 vector 帐户

我创建了一个拥有 3 个帐户Person 然后我想对一个帐户进行 changeOnwner() 但不小心所有帐户都得到了这个新帐户所有者。代码正在运行,而且非常直观。 我不明白为什么所有 3 个帐户中的引用都发生了变化。如何解决这个问题?

#include <iostream>
#include <vector>
using namespace std;
class Person{
public:
char* name;
int age;

Person(char* name, int age){
this->name = name;
this->age = age;
}
~Person(){
}

void show(){
cout<<name<<" "<<age<<" yo";
}
};
class Account{
public:
Person& owner;
double money;
Account(Person* owner, double money):
owner(*owner) , // this->owner = *owner;
money(money) { //Uninitialized reference member
}
void show(){
cout<<"\n-------------\n";
owner.show();
cout<<endl;
cout<<money<<" USD\n-------------";
}
};

class Bank{
public:
vector<Account*>* v;
Bank(){
v = new vector<Account*>();
}
Account* openNewAccount(Person* client, double money){
Account* r = new Account(client, money);
v->push_back(r);
return r;
}
void zmienWlasciciela(Person& o, Account* r){
r->owner = o;
}
void usunRachunek(Account* r){
delete r;
}
void show(){
for(int i = 0; i < v->size(); i++)
v->at(i)->show();
}
~Bank(){
delete v;
}
};



int main(){
Bank* bank = new Bank();
Person* thomas = new Person("thomas", 34);
Account* r1 = bank->openNewAccount(thomas, 64363.32);
Account* r2 = bank->openNewAccount(thomas, 41251.54);
Account* r3 = bank->openNewAccount(thomas, 3232.32);
bank->show();

Person* margaret = new Person("Margaret", 23);
bank->zmienWlasciciela(*margaret, r2);
cout<<"I have changed owner of account r2"<<endl;
bank->show();
return 0;
}

最佳答案

有一个引用成员变量真的很讨厌:避免 Person& owner; 把它作为一个值。

原因是构建 Account 对象的东西可能超出范围,您将留下一个悬空引用

你的 Person 类也有一个问题,如果它被复制给另一个人;

Person a("name", 20);
Person b = a;

两者的名称数据都指向相同的内存区域。不好,因为一个名字的改变也会改变另一个的名字。要解决这个问题,您必须重写复制构造函数,或者做其他类似的事情...

此外,用于构造 Person 的名称数据也可能超出范围,您将遇到访问冲突!在我上面使用你的类的方式中,我会遇到问题,因为常量字符串“name”会在第一个“;”之后超出范围。

你最好的选择是使用 std::string name 因为我看到你已经在使用 STL。

把它们放在一起,

class Person{
public:
std::string m_name;
unsigned m_age;

Person(char* name, unsigned age) :
m_name(name),
m_age(age)
{
}
~Person()
{
}

void show(){
cout<<m_name.c_str()<<" "<<age<<" yo";
}
};

关于c++ - 更改一个对象的引用并且它会更改集合中的所有对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16634531/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com