2012-01-18 53 views
1

我正在实现一个类(或者说一个Base类,并从它继承的类),它持有一个Integer。现在我有这个问题,我只能指针返回值一次。:错误的第二个返回值IntObject.getValue()

Inte foo = Inte(5); 
cout << foo.getValue() << endl; // 5 
foo.setValue(10); 
cout << foo.getValue() << endl; // 10 
cout << foo.getValue() << endl; // 4199696 

的getValue函数并不做任何事情,除了返回指针,我不知道为什么它后返回4199696第一个getValue()。

这里我的课:

class Object { 

public: 
    virtual int getValue() = 0; 
    virtual void setValue(int *pointer) = 0; 
    virtual string toString() = 0; 

}; 


class Inte : public Object { 
private: 
    int* value; 
public: 
     Inte (int *val){ 
      value = val; 
     } 

     Inte (int val){ 
      int a = val; 
      value = &val; 
     } 

     virtual int getValue(){ 
      return *value; 
     }; 

     virtual void setValue(int *pointer){ 
      value = pointer; 
     }; 

     virtual void setValue(int val){ 
      int a = val; 
      value = &val; 
     }; 

     virtual string toString(){ 
      stringstream ss; 
      string s; 
      ss << value; 
      ss >> s; 
      return s; 
     }; 
}; 
+0

请注意,'toString()'不返回任何内容。 – hmjd 2012-01-18 14:19:56

+0

现在呢,谢谢:) – pharno 2012-01-18 14:22:21

回答

2
virtual void setValue(int val){ 
    int a = val; 
    value = &val; 
}; 

在此功能中存储一个局部变量(val)的地址。一旦此函数退出,该地址将变为无效,从而尝试解除引用该地址undefined behavior的指针(这是您在getValue中执行的操作)。

+0

谢谢。但为什么它为getValue()的第一个调用工作?以及我如何修复它? – pharno 2012-01-18 14:18:25

+0

@pharno:未定义的行为意味着任何事情都可能发生。这包括它可以工作一次,两次或更多,但在某种程度上仅仅因为没有明显原因而失败。为了解决这个问题,你必须动态地创建一个新的'int'对象:'value = new int(val)' - 注意这会引入大量新问题,就像现在进入手动资源管理的世界。 – 2012-01-18 14:24:46

+0

“未定义的行为”意味着编译器和语言都不再关心你的程序做了什么或者它为什么做。可以是任何结果的原因,实际上,它是在程序的地址空间中随机数据加载到内存之前开始的。 – bronekk 2012-01-18 14:30:01