在不同地址创建类的新实例
Creating new instances of a class at different addresses
我对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_ptr
或std::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;
}
相关文章:
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 根据参数创建派生类的新实例
- 我们可以在没有新实例化的情况下声明一个抽象方法来返回抽象超类中的子类对象吗
- C++ 实例化新对象时不接受继承方法默认参数值
- 实例化新类时未调用的方法
- 在 C++17 中的每个实例化时生成一个新类型
- “auto”每次创建一个新的变量实例
- cpp 中是否存在一种数据结构,可以轻松地提供一种基于已存在的实例构建新结构的方法
- 我应该始终使用shared_ptr创建类实例(而不是仅仅是新)
- 分割故障 - 遇到问题,创建新的数组实例
- 基于现有实例创建类的新实例
- 从地图访问对象会导致新对象C 的实例化
- 将unordered_map的新实例插入到unordered_map中
- 将新放置到缓冲区后,缓冲区和实例是否具有相同的 void* 地址?
- 如何自动生成结构的新实例
- 自定义容器在保留空间时不必要地创建新元素实例
- char阵列使用新的实例化后显示垃圾
- 是否为类的每个实例实例化了私有类变量
- 是否可以强制新模板实例化
- 为什么在构造函数退出时创建新的实例(对象)