2012-01-18 20 views
1

私は、クラスを実装しています(あるいは、クラスを継承しています)。これはIntegerを保持しています。今私は、のgetValue関数は何もしません2番目のIntObject.getValue()の戻り値が正しくありません

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

:私は一度だけ値へのポインタを返すことができ、問題を抱えているポインタを返す以外にも、私はそれが後に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

+0

今、ありがとうございます:) – pharno

答えて

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

は、ローカル変数(val)のアドレスを格納します。このアドレスが無効になると、このアドレスはundefined behaviorを保持するポインタ(getValueで行うことです)を逆参照しようとします。

+0

ありがとうございます。しかし、なぜgetValue()の最初の呼び出しでうまくいくのですか?どのように私はそれを修正することができますか? – pharno

+0

@pharno:未定義の動作とは、何かが起こる可能性があることを意味します。これには、1回、2回、またはそれ以上の動作が含まれますが、明らかに理由がない場合は、ある時点で失敗します。これを修正するには、新しい 'int'オブジェクトを動的に作成する必要があります:' value = new int(val) ' - 手動リソース管理の世界に入ったので、これは新しい問題のホストを紹介します。 –

+0

"未定義の振る舞い"は、コンパイラも言語も、あなたのプログラムが何をしているのか、なぜそれがそれをするのかを気にしていないことを意味します。実際には、メモリにロードされる前のプログラムのアドレス空間にあるランダムなデータから始めて、結果には何らかの理由があります。 – bronekk

関連する問題