【问题标题】:creating 100 objects with different name in a loop在循环中创建 100 个不同名称的对象
【发布时间】:2025-12-30 03:25:06
【问题描述】:

如何创建一个循环来创建 100 个不同的对象。假设我有课myPage Page1。 我想从myPage 创建 100 个这样的对象,比如说 Page1....Page100 我还需要将对象名称保存在变量中,例如char name[10]

for(int i = 0; i<100; i++)
{
    // create object with different name of my class
    // char name = name of object//something like that
}

有可能吗?怎么样?

【问题讨论】:

标签: c++ object for-loop


【解决方案1】:

有可能吗?

否。 C++ 中变量的名称是在编译时分配的。

只需使用std::vector&lt;myPage&gt;(或std::array&lt;myPage, N&gt;,如果大小是在编译时确定且不应更改)并通过其索引按位置访问对象。

【讨论】:

  • +1 但要将名称保存在某处(然后搜索名称)我会使用std::map
  • @Adriano:也可以这样做,但在我看来,他用来检索变量的只是索引。毕竟,Page1Page2、...Page100 的变化只是后缀(索引)
  • 你说得对,直到我看到你的回答我才真正明白他想要达到什么目的
  • 即使没用,我想知道 Boost.Preprocessor 是否有可能。
  • @FredericS:我不知道,也不想知道,除非我有充分的理由;-)
【解决方案2】:

说“C++ 中变量的名称是在编译时分配的。”,Andy Prowl 是对的, 所以你不能在执行过程中更改变量的名称。

但是,如果您想做一些不可能的事情,还有其他方法可以解决您的问题, 您可以实例化一个装满所有 myPage 实例的容器,而不是获得 100 个相同类型的 var,这是一个丑陋的例子:

std::map<std::string, myPage*> pages;
for (int i = 0; i < 100; ++i)
{
   std::string name = "page";
   page += i;
   pages.insert (std::make_pair (name, new myPage ()));
}

和访问:

myPage* page = pages["page18"];

【讨论】:

  • 这将在 99% 的情况下泄漏内存。如果您在将对象放入地图时构建对象,而没有对它们进行处理,这意味着您希望地图拥有您的对象的所有权。首先使用智能指针,或者只使用emplace_back 实际对象而不是指针。
  • 我不想使用智能指针或其他东西来显示这段代码的“主要”部分:名称递增,这就是为什么它是一个“丑陋的例子”。但我真的不明白你所说的内存泄漏是什么意思。这是只有地图在实例上有指针的问题吗?因为 std::map 析构函数调用了它所有组件的析构函数。因此,当您不再需要 myPage 时,您可以删除所有 myPage 实例。我错了吗?
  • 是的,你错了。当 map 持有对象时,它会调用这些对象的析构函数。当映射保存原始指针时,只有指针占用的内存将被释放,指向的对象继续存在。什么都不是deleted,也没有调用析构函数。
【解决方案3】:

不,这是不可能的。 当您创建对象时,您会创建一个标识符(源代码中的对象名称),并且在运行时无法更改此标识符。您可以创建一个具有 name-member 的类并在构造时分配它。

【讨论】: