C++ 为什么当多个指针引用一个对象时,会检索到错误的数据。
我将Person对象作为参数传递给TimesTwo构造函数和PlusTen构造函数。这两个类都指向同一个人对象。当我在PersonObj中更改int age字段时,times2和PlusTen返回的信息也应该更改,但是PlusTen没有返回预期值C++ 为什么当多个指针引用一个对象时,会检索到错误的数据。,c++,pointers,C++,Pointers,我将Person对象作为参数传递给TimesTwo构造函数和PlusTen构造函数。这两个类都指向同一个人对象。当我在PersonObj中更改int age字段时,times2和PlusTen返回的信息也应该更改,但是PlusTen没有返回预期值 #include <iostream> using namespace std; class PersonObj { public: int age; PersonObj(int x) {
#include <iostream>
using namespace std;
class PersonObj
{
public:
int age;
PersonObj(int x)
{
age = x;
}
int getAge()
{
return age;
}
void setAge(int x)
{
age =x;
}
};
class TimesTwo
{
public:
PersonObj *person;
TimesTwo(PersonObj p)
{
person = &p;
}
int getAgeTimesTwo()
{
return person->getAge() * 2;
}
};
class PlusTen
{
public:
PersonObj *person;
PlusTen(PersonObj p)
{
person = &p;
}
int getAgePlusTen()
{
return person->getAge() + 10;
}
};
int main()
{
int num;
PersonObj person(25);
TimesTwo t(person);
PlusTen p(person);
num = t.getAgeTimesTwo();
cout << "Person's age * 2 = " << num <<endl;
num = p.getAgePlusTen();
cout << "Person's age + 10 = " << num <<endl;
person.setAge(28); // Change/Set person's age to 26
num = t.getAgeTimesTwo();
cout << "Person's age * 2 = " << num <<endl;
num = p.getAgePlusTen();
cout << "Person's age + 10 = " << num <<endl;
return 0;
}
TimesTwo和PlusTen的构造函数通过值而不是引用接收PersonObj参数。您正在设置指向临时对象的指针,该临时对象在构造函数末尾被释放。为了确保它们指向同一个对象,您需要将PersonObj作为引用传递 而不是
times2(PersonObj p)
,
试用
times2(PersonObj&p)
您的times2和PlusTen构造函数通过值而不是引用获取PersonObj参数。您正在设置指向临时对象的指针,该临时对象在构造函数末尾被释放。为了确保它们指向同一个对象,您需要将PersonObj作为引用传递
而不是
times2(PersonObj p)
,
试用
times2(PersonObj&p)
您正在抓住悬空的指针。未定义的行为。我不知道那是什么意思。我更喜欢Java,你可以设置person
指向传递给构造函数的p
参数。但一旦构造函数返回,该参数就不再存在。因此,您已将person
设置为指向一个不再存在的PersonObj
。您将保留悬空指针。未定义的行为。我不知道那是什么意思。我更喜欢Java,你可以设置person
指向传递给构造函数的p
参数。但一旦构造函数返回,该参数就不再存在。因此,您将person
设置为指向一个不再存在的PersonObj
。因此,从主times2传递PersonObj的值。现在进入TimesTwo构造函数,它获取对PersonObj person的'&'引用。然后在构造函数的代码中,指针指向PersonObj实例的引用。@JuanLantigua,或者,您可以将对PersonObj
的引用存储在TimesTwo
/PlusTen
类中,而不是指针,因为您只是在构造函数中设置它们。TimesTwo(PersonObj&p){person=&p;}这看起来很奇怪,几乎是多余的。因此从主TimesTwo传递PersonObj的值。现在进入TimesTwo构造函数,它获得对PersonObj person的“&”引用。然后在构造函数的代码中,指针指向PersonObj实例的引用。@JuanLantigua或者,您可以存储引用指向PersonObj
,在times2
/PlusTen
类中,而不是指针,因为您只是在构造函数中设置它们。
Person's age * 2 = 50
Person's age + 10 = 4199934
Person's age * 2 = 56
Person's age + 10 = 4199934