你能否在C++中使用变量创建对象?

4
我希望创建一个类的多个对象,但这个数量在运行时是未知的。直觉告诉我应该使用以下循环来创建我的对象:
for (int count = 0;  count < no_of_objects; count ++)
{
    ClassName object_name[count]
}

然而,编译器似乎不喜欢使用变量作为对象名,因此这种方法行不通。我是否可以通过循环创建这些对象,或者必须使用其他方法?

请注意,我并没有长时间使用C++,并且最近才开始学习编程,所以我的语言知识有些有限 - 到目前为止,数组是我唯一学过的数据结构 - 没有向量等。

4个回答

6

现在是学习向量的时候了:

std::vector<ClassName> objects (no_of_objects);

现在使用对象[0]到对象[no_of_objects - 1]; 注意,objects.size()等于no_of_objects。当您准备好时,查看vector的方法等,但目前这些加上知道要包含的标题()就足以将对象用作动态数组。

2
我们可以使用任何结构,没有限制。我会研究一下向量。谢谢。 - user360907
@pstrjds:这些评论并不是讨论Chris的课程内容或者如何最好地学习C++的好方法。我只想说我不同意你的前提。 - Fred Nurk
2
@pst:Bjarne Stroustrup不同意你的观点。他在他的最新书籍的第116页介绍了std::vector,而数组和指针则推迟到第569页。他的大学课程也是按照这种方式结构化的。 - fredoverflow
@FredOverflow 我无法与Bjarne争论。 - pstrjds
2
@pstrjds:拿起Koenig/Moo的《Accelerated C++》并阅读。这是一本入门书,但即使你是经验丰富的C++开发人员,你仍然很可能喜欢阅读它。Koenig&Moo是第一个正确教授C++的人,并在教授其内部工作之前长时间教授了某些组件的使用方法。对于那些曾经接受过传统教育的人来说,在教授模板之前使用std::vector<>进行教学可能会感到陌生,但是有很多语言中string只是一个不可挑战的黑匣子。我用这种方式教授C++已经多年了,并取得了很大的成功。 - sbi
显示剩余4条评论

2

如果您在运行时不知道对象的数量,则需要在C++中动态分配它们。您需要类似于以下代码:

ClassName* pmyClasses = new ClassName[no_of_objects];

这将分配一个数组来保存你的类对象,然后你需要对它们进行初始化。
for (int i=0; i < no_of_objects; i++)
{
    pmyClasses[i] = new ClassName();
}

您可以通过数组索引器访问它们:

for (int i=0; i < no_of_objects; i++)
{
     pmyClasses[i].SomeFunction();
}

这里需要注意的是,如果您使用new来分配内存,那么您需要使用delete来释放它。因为这是一个数组声明,所以您需要使用delete []运算符。

for (int i=0; i < no_of_objects; i++)
{
    delete pmyClasses[i];
}
delete [] pmyClasses;

如果您在类中使用此功能,则将delete放在类的析构函数中非常重要:
class UsingMyClass
{
    private:
        ClassName* pmyClasses;

    public:
        UsingMyClass(int no_of_objects)
        {
            pmyClasses = new ClassName[no_of_objects];
            for (int i=0; i < no_of_objects; i++)
            {
                 pmyClasses[i] = new ClassName();
            }
        }

        ~UsingMyClass()
        {
            for (int i=0; i < no_of_objects; i++)
            {
                 delete pmyClasses[i];
            }

            delete [] pmyClasses;
        }
 }

这样做的话,当UsingMyClass对象超出作用域时(假设它不是通过调用newmalloc创建的),ClassName对象数组将被清理。


0
如果您的类具有默认构造函数(并且希望默认构造实例),则可以使用一个数组new,即new ClassName[some_number] - 它的类型为ClassName*)。

如果没有默认构造函数,则可以尝试使用放置new或使用指针数组并手动每个使用new


0

为了动态分配内存,您必须使用new关键字。

ClassName = new object_name[count];

并且一定要使用delete关键字在之后释放内存。


你需要使用 ClassName* pObjects =delete [] - Fabio Fracassi

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