【发布时间】:2022-01-08 10:46:39
【问题描述】:
我正在尝试创建两个对象数组,这样如果我更改数组的一个元素,它应该反映在第二个数组中(基本上是两个对象指针数组,在每个相应的索引中具有相同的指针)
代码如下:
#include <iostream>
using namespace std;
class A{
private:
int n;
public:
A(int num){
n = num;
}
void print(){
cout << n;
}
};
int main() {
A** a = new A*[5];
A** b = new A*[5];
for(int i=0; i< 5; i++){
int n;
cout << "Enter a number: ";
cin >> n;
A obj(n);
a[i] = &obj;
b[i] = &obj;
}
// all the elements of these arrays are the last number entered by user
for(int i=0; i< 5; i++){
a[i]->print();
cout << " ";
b[i]->print();
cout << endl;
}
// because they point to the same memory location
for(int i=0; i< 5; i++){
cout << a[i] << " " << b[i] << endl;
}
}
输出如下:
Enter a number: 1
Enter a number: 2
Enter a number: 3
Enter a number: 4
Enter a number: 5
5 5
5 5
5 5
5 5
5 5
0x7fff6ee63530 0x7fff6ee63530
0x7fff6ee63530 0x7fff6ee63530
0x7fff6ee63530 0x7fff6ee63530
0x7fff6ee63530 0x7fff6ee63530
0x7fff6ee63530 0x7fff6ee63530
我想要什么输出:
Enter a number: 1
Enter a number: 2
Enter a number: 3
Enter a number: 4
Enter a number: 5
1 1
2 2
3 3
4 4
5 5
some_memory_address_1 some_memory_address_1
some_memory_address_2 some_memory_address_2
some_memory_address_3 some_memory_address_3
some_memory_address_4 some_memory_address_4
some_memory_address_5 some_memory_address_5
我知道是这种情况,因为 C++ 使用在 for 循环内定义的 n 相同的内存位置,但我怎样才能避免这种情况并获得我想要的结果?
【问题讨论】:
-
你需要使用
new来分配对象。A obj(n);在 for 循环中只存在到迭代结束然后它被销毁并且你有悬空指针。 -
A** a = new A*[5];在 C++ 中是迟钝的。简单的A* a[5];对于一个简单的本地小数组就足够了。事实上,由于您不需要处理多态性或需要交换元素,因此您可以完全避免需要存储指针:A a[5];(但您需要定义一个默认构造函数)。似乎根本不需要b数组。