2

これは、今日のクイズのコードです。言語: C++.

class Shape
{ 
protected:
int *x;
int *y;
public:
void draw()
    {
      //we were supposed to add random code here.  
    }
};

選択したオーバーロードされた演算子を作成し、それを main に実装するように求められました。私はポインターに少し怖がっていたので、次のようなコンストラクターを作成することにしました。

class Shape
{ 
protected:
int *x;
int *y;
public:
void draw()
    {
       cout<<*x<<endl;
    }
    Shape(){};
    Shape{int a, int b)
    {
        x = &a; //this I thought would allow *x to act just like a normal variable. 
        y = &b; 
    }
    //code for operator overloading.
};

クイズに合格したような印象を受けましたが、自宅のコンピューターに実装してみると、draw 関数がガベージ値/メモリ アドレスを返すことに気付きました。その結果、他のすべてが苦しみます。なぜこれが起こっているのか教えてください。ポインタの範囲と関係がありますか? ポインターを通常の変数として使用できるようにしたい。ただの学生です。前もって感謝します!

4

2 に答える 2

3

これが C++ のように見える場合、問題は、コンストラクターのパラメーターのアドレスにポインターを割り当てていることです。

コンストラクターのパラメーターは、コンストラクターが呼び出されたときに作成され、コンストラクターが破棄されたときに破棄されるため、コンストラクターが破棄された後、ポインターはガベージを指します。非関数ローカル変数にポインターを割り当てます。

于 2013-05-13T14:35:02.093 に答える
2

a と b はスタックに置かれ、x と y ポインターを a と b のアドレスに割り当てると、x と y がスタック内のどこかを指すようになるため、*x (および *y) の値はたまたまそれらのアドレスにスタックします。

于 2013-05-13T14:51:32.490 に答える