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

Creating new instances of a class at different addresses

本文关键字:新实例 实例 地址 创建      更新时间:2023-10-16

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

所以我的问题是,现在我怎么能在不同的地址创建一个类的几个实例?

所以我的问题是,现在我怎么能在不同的地址创建一个类的几个实例?

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

tr1::unordered_map<int, paul> glenn;
for(int i = 0; i < 5; i++){
    glenn[i] = paul(i*i);
}

如果你真的想在你的map中存储指针,将它们分配到堆上以延长它们的生命周期,并且更喜欢使用智能指针,如std::unique_ptrstd::shared_ptr(这些智能指针需要使用c++ 11或更高版本)。

堆分配将把每个new ly创建的对象存储在堆内存中的不同地址。智能指针会在对象生命周期结束时清理它们(垃圾收集的一种基本形式)。

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;
}