在不同的地址创建类的新实例

时间:2014-05-13 19:53:27

标签: c++ class pointers instance

我对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的同一个实例。

所以现在我的问题是如何在不同的地址创建一个类的几个实例?

2 个答案:

答案 0 :(得分:3)

  

所以现在我的问题是如何在不同的地址创建一个类的几个实例?

忘记地址和指针,并存储对象:

tr1::unordered_map<int, paul> glenn;

for(int i = 0; i < 5; i++){
    glenn[i] = paul(i*i);
}

答案 1 :(得分:0)

如果您真的想在地图中存储指针,请在堆上分配指针以延长其生命周期,并且更喜欢使用智能指针,例如std::unique_ptrstd::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;
}