【问题标题】:Creating new instances of a class at different addresses在不同地址创建类的新实例
【发布时间】: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);。然后你需要记住在以后的某个时间给每个人deleteshared_ptrunique_ptr 可以为您省去清理工作,但他们在后台做同样的事情。

标签: c++ class pointers instance


【解决方案1】:

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

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

tr1::unordered_map<int, paul> glenn;

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

【讨论】:

    【解决方案2】:

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

    堆分配会将每个newly 创建的对象存储在堆内存中的不同地址。智能指针将在对象的生命周期结束时清理对象(垃圾回收的原始形式)。

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

    【讨论】:

    • 在这种情况下,std::unique_ptrs 会在 glenn 超出范围时被清理。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多