0

まず、整数ポインターとクラスを定義しますA。のメソッドにポインターを渡しAて保存したい。

Aのメソッドを呼び出すと、クラスの整数メンバーが常に変化することがわかりましたA

これらの変更を回避する方法について混乱しています。

#include <IOSTREAM>

using namespace std;

class   A
{
private:
   int* a;
public:
   A()
   {

   };
   ~A()
   {

   };

void setA(int n)
{
    cout << "n == " << n << "&n == " << &n << endl;
    a = &n;
    cout << "now a== " << a << endl;
}

void PassA(int* &outint)
{
    cout << "a == " << a <<  "  *a == " << *a <<endl;
    outint = a;
    cout << "outint = " << outint << endl;
}

void Print()
{
    cout << "a ==================== " << a << endl;
    cout << "*a ==================== " << *a << endl;
}
};

int main()
{
A A_1;
int num = 5;
    A_1.setA(num);

    int *intb= NULL ;
    A_1.PassA(intb);
    //When the line above done,the value of A_1.a will change.
    cout << "intb ==  " << intb << endl;
    cout << "*intb =="  << *intb << endl;
    cout << "num ==" << num << endl;
A_1.Print();
return 0;
}

出力:

n == 5&n == 0x28fe90
今a== 0x28fe90
a == 0x28fe90 *a == 2686708
outint = 0x28fe90
intb == 0x28fe90
*intb ==4619604
数 ==5
==================== 0x28fe90
*a ==================== 4619604
4

1 に答える 1

1

メモリの場所をスタック上の値に設定しています。メソッドが終了すると、スタック値は破棄されます。独自のメモリを割り当てる必要がある場合は、new と delete を使用して行います。

void setA(int n)
{
    cout << "n == " << n << "&n will be different every time" << endl;
    a = new int();
    *a = n;
    cout << "now a== " << a << endl;
}

または、呼び出し先で変数の実際のアドレスを使用する場合は、int ではなく int ポインターを渡す必要があります。

void setA(int* n)
{
    cout << "n == " << *n << " &n = " << n << endl;
    a = n;
    cout << "now a== " << a << endl;
}
于 2013-08-29T03:03:38.570 に答える