我对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
的同一个实例。
所以现在我的问题是如何在不同的地址创建一个类的几个实例?
答案 0 :(得分:3)
所以现在我的问题是如何在不同的地址创建一个类的几个实例?
忘记地址和指针,并存储对象:
tr1::unordered_map<int, paul> glenn;
for(int i = 0; i < 5; i++){
glenn[i] = paul(i*i);
}
答案 1 :(得分:0)
如果您真的想在地图中存储指针,请在堆上分配指针以延长其生命周期,并且更喜欢使用智能指针,例如std::unique_ptr
或std::shared_ptr
(这些智能指针需要使用C ++ 11或更高版本。)
堆分配会将每个new
创建的对象存储在堆内存中的不同地址上。智能指针将在它们的生命周期结束时清理对象(垃圾收集的原始形式)。
int main(void) {
tr1::unordered_map<int,std::unique_ptr<paul>> glenn;
for(int i = 0; i < 5; i++){
glenn[i].reset(new paul(i*i)); // prefer to use std::make_unique if/when it is available.
}
for(int i = 0; i < 5; i++){
cout << i*i << "," << (*glenn[i]).stuff << "\n";
}
return EXIT_SUCCESS;
}