C++ 为什么当多个指针引用一个对象时,会检索到错误的数据。

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) {

我将Person对象作为参数传递给TimesTwo构造函数和PlusTen构造函数。这两个类都指向同一个人对象。当我在PersonObj中更改int age字段时,times2和PlusTen返回的信息也应该更改,但是PlusTen没有返回预期值

#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