错误的第二个返回值IntObject.getValue()
我正在实现一个类(或者说一个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;
};
};
virtual void setValue(int val){
int a = val;
value = &val;
};
在此功能中存储一个局部变量(val
)的地址。一旦此函数退出,该地址将变为无效,从而尝试解除引用该地址undefined behavior的指针(这是您在getValue
中执行的操作)。
谢谢。但为什么它为getValue()的第一个调用工作?以及我如何修复它? – pharno 2012-01-18 14:18:25
@pharno:未定义的行为意味着任何事情都可能发生。这包括它可以工作一次,两次或更多,但在某种程度上仅仅因为没有明显原因而失败。为了解决这个问题,你必须动态地创建一个新的'int'对象:'value = new int(val)' - 注意这会引入大量新问题,就像现在进入手动资源管理的世界。 – 2012-01-18 14:24:46
“未定义的行为”意味着编译器和语言都不再关心你的程序做了什么或者它为什么做。可以是任何结果的原因,实际上,它是在程序的地址空间中随机数据加载到内存之前开始的。 – bronekk 2012-01-18 14:30:01
请注意,'toString()'不返回任何内容。 – hmjd 2012-01-18 14:19:56
现在呢,谢谢:) – pharno 2012-01-18 14:22:21