【发布时间】:2014-05-13 19:53:26
【问题描述】:
我对 C++ 比较陌生。我已经编写 Java 有一段时间了,所以如果我使用一些 java 术语而不是正确的 c++ 术语,我提前道歉。
我想创建一个哈希映射 (unordered_map),它将 int 映射到指向类的指针。现在我的麻烦是在不同的地址创建类的“新”实例。
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <tr1/unordered_map>
using namespace std;
class paul{
public:
paul(int n) {stuff = n;}
int stuff;
};
int main(void) {
tr1::unordered_map<int,paul*> glenn;
for(int i = 0; i < 5; i++){
paul victor(i*i);
glenn[i] = &victor;
}
for(int i = 0; i < 5; i++){
cout << i*i << "," << (*glenn[i]).stuff << "\n";
}
return EXIT_SUCCESS;
}
上面的代码不起作用。它产生输出:
0,16
1,16
4,16
9,16
16,16
这是因为paul 的每个新实例都在同一地址创建,因此glenn 中的每个键都将映射到paul 的同一实例。
所以我现在的问题是如何在不同地址创建一个类的多个实例?
【问题讨论】:
-
为什么要在地图中存储指针?顺便说一句,问题是您正在存储悬空指针。
-
为什么您不想将对象存储在地图中?您的指针悬空是因为它们指向的对象立即不再存在。
-
@HenrikSommerland:你还想把它保存在哪里?在涅槃中,因为那是你现在保存它的地方?
-
不,当我想到它时,我没有理由不这样做。我只是有点厚。由于我不会在其他地方收集相同对象的任何其他集合,因此我也可以始终将它们保留在地图中。
-
仅作记录,如果您确实需要存储指针,那么您需要将
pauls 分配为paul* victor = new paul(i*i);。然后你需要记住在以后的某个时间给每个人delete。shared_ptr和unique_ptr可以为您省去清理工作,但他们在后台做同样的事情。
标签: c++ class pointers instance