我有两节课。 class1
和class2
。 class2
创建一个数组,其元素类型为class1
。 class2
的成员指向该数组。我可以使用class 2's
getpointer
方法访问指针,但是当我尝试使用指针访问数组元素的成员时,会得到意外的结果。
代码如下:
#include <iostream>
using namespace std;
class class1{
int a;
int b;
public:
class1(){}
class1(int x, int y){a = x; b = y;}
int geta(){return a;}
int getb(){return b;}
};
class class2{
int c;
int d;
class1 *e;
public:
class2(int x, int y){c = x; d = y;}
void setE(){
class1 arr[3];
class1 arrTemp (0,0);
arr[0] = arrTemp;
class1 arrTemp1 (1,1);
arr[1] = arrTemp1;
class1 arrTemp2 (2,2);
arr[2] = arrTemp2;
cout << "Element 1, A = ";
cout << arr[0].geta() << endl;
cout << "Element 1, B = ";
cout << arr[0].getb() << endl;
cout << "Element 2, A = ";
cout << arr[1].geta() << endl;
cout << "Element 2, B = ";
cout << arr[1].getb() << endl;
cout << "Element 3, A = ";
cout << arr[2].geta() << endl;
cout << "Element 3, B = ";
cout << arr[2].getb() << endl;
class1 *pt;
pt = &arr[0];
e = pt;
}
class1* getpointer(){return e;}
};
int main(){
class2 testObj (1,2);
testObj.setE();
class1 *objPointer = testObj.getpointer();
class1 tempclass1;
tempclass1 = *(objPointer + 0);
cout << "Element 1, A = ";
cout << tempclass1.geta() << endl;
cout << "Element 1, B = ";
cout << tempclass1.getb() << endl;
tempclass1 = *(objPointer + 1);
cout << "Element 2, A = ";
cout << tempclass1.geta() << endl;
cout << "Element 2, B = ";
cout << tempclass1.getb() << endl;
tempclass1 = *(objPointer + 1);
cout << "Element 3, A = ";
cout << tempclass1.geta() << endl;
cout << "Element 3, B = ";
cout << tempclass1.getb() << endl;
};
这是输出:
Element 1, A = 0
Element 1, B = 0
Element 2, A = 1
Element 2, B = 1
Element 3, A = 2
Element 3, B = 2
Element 1, A = 0
Element 1, B = 0
Element 2, A = -360531408
Element 2, B = 29391
Element 3, A = -360531408
Element 3, B = 29391
使用第一组cout
语句,我验证数据是否正确进入数组。
看起来我为第一个元素获取了正确的数据,但是此后,我从指针获取的内容与实际数组完全不同。我是C ++的新手,但我认为*(Pointer + i)
等于arr[i]
。
答案 0 :(得分:2)
在您的示例中,至少有一个问题位于此处:
void setE(){
class1 arr[3];
...
class1 *pt;
pt = &arr[0];
e = pt;
}
arr[3]
是一个本地对象,该对象在方法结束时被销毁。仍然使类成员e
指向该对象。
方法结束arr
后,内存将释放,并且可以由其他对象随意覆盖。因此,在使用e
读取内存时,会观察到意外的值。