如何生成C++动态对象名称?

7
我想根据用户输入的数量/数量生成一些对象(在C++中)。
我曾经听说过必须使用指针技巧来完成,创建一个指向所需Object类型数组的指针,然后在运行时动态增加数组的大小。
是否有直接使用名称(如Object1、Object2... ObjectX)而不是使用类名* Object[],然后使用数组索引获取对象的解决方法?
无论哪种情况,如果有人能澄清这个问题,那就太好了。
谢谢!

从问题中几乎不可能理解你的意思。你是在谈论一个长度可变的容器吗? - Daniel Earwicker
5个回答

8
如果你想要动态大小的数组,可以使用std::vector。你无法调整内置数组的大小。 如果你想通过字符串名称获取对象,那么应该使用std::map,它有一个索引器:
std::map<string, Classname> myMap;
myMap["Object1"] = Classname();
Classname newClassname = myMap["Object1"];

+1 表示补偿无法解释的负评 -- 如果您想通过字符串名称而不是数字来处理对象,则使用映射是一个很好的方法。 - Alex Martelli
谢谢你提供有关地图的想法。我一定会更深入地研究它。 - suVasH.....
我知道这是一个非常老的帖子,我可能不应该在这里发表评论,但我忍不住注意到在这个例子中,您仍然必须使用特定于对象的名称(newClassname)。那么使用映射的意义何在?是否可以像对象本身一样使用mapname[key],而无需明确命名它,例如mapname[key]->somefunc(),假设声明为std::map<key,someclass*> mapname?我试图理解为什么如果不能将映射条目用作动态生成的名称,那么映射是有用的。 - Subhamoy S.

6
到目前为止,还没有人解释为什么您的想法是错误的。C++是一种编译语言,它会尽力将源程序转换为高效的机器代码。因此,您给变量命名的名称仅在编译时可用,即将源代码转换为可执行文件时。之后,当您想要动态创建对象时,这些信息就不再可用了。程序只知道操作数所在的机器指令地址。

谢谢你的解释,正是我需要的(为了理解)。干杯! - suVasH.....

3
没有,而且你也不需要。使用 std::vector 即可。

3

9年前我开始学习编程时也曾问过同样的问题。答案是:你做不到。

你确实可以使用数组并动态调整大小,但使用STL向量会更加容易(一旦你学会了如何使用它)。


9年前你说的 :) 这让我等了很久,呵呵!非常感谢回复! - suVasH.....

3
由于C++没有变量(和元数据)可以存放的“环境”(reflection),所以您无法这样做。此外,在C++中,当代码被编译时,所有变量名称都会消失。

实现您想要的效果的方法是使用一个Map,其中键是字符串。

谢谢你再次提供地图的想法。我一定会去看看的。 - suVasH.....

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接