我得到了以下代码,其中在一个循环中创建了100个对象。

我的问题是

  • 为什么我需要在这里使用new,因为我已经事先知道我需要多少内存。
  • 是否有与我的示例代码相同的代码,没有动态内存分配? (并且不使用诸如vector之类的std容器)(...类+动态苦苦在一起变得令人困惑)

  • 示例代码:
    class Particle {...};
    Particle *myParticles[ 100 ];
    
    for( int i = 0; i < 100; i++ )
    {
        myParticles[ i ] = new Particle(x,y);          //x and y are randomized for each loop
    }
    

    [更新]:class Particle没有默认的构造函数。因此,Particle myParticles[ 100 ];将不起作用。请注意,可以通过以下方法来解决:设置默认的构造函数,然后创建方法Particle::setXY (double x, double y)

    但是有没有一种方法可以解决此问题而无需创建新方法?即仅使用构造函数,并且没有动态内存分配。

    我只是觉得很奇怪,没有动态内存分配就无法做到这一点。还是我必须接受这仅仅是C++语言的怪癖?

    最佳答案

    您不必使用new。您可以按照自己的建议创建一个Particle数组:

    Particle myParticles[100];
    

    事实是,它将是默认构造的,因为您无法指定仅在运行时可用的(x,y)参数。因此,您必须提供一种方法来构造Particle后指定此信息,例如:
    for( int i = 0; i < 100; i++ )
    {
        myParticles[i].SetCoords(x,y);          //x and y are randomized for each loop
    }
    

    这需要Particle的默认构造函数和SetCoords之类的方法来在构造后配置实例。因此,如果Particle的代码超出您的控制范围,则可能不是一个选择。

    但是我真的会考虑使用vector,因为这是非常方便和有用的事情。如果编程正确,它将使用很少的动态分配,因此效率很高。例如:
    vector<Particle> myParticles;
    
    myParticles.reserve(100);
    for( int i = 0; i < 100; i++ )
    {
        myParticles.push_back(Particle(x,y));          //x and y are randomized for each loop
    }
    

    这应该只使用一个分配。假设Particle相当轻巧,可以由复制构造函数复制。

    关于c++ - 如何在没有动态内存分配的情况下创建对象数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15966801/

    10-12 04:06