堆上的C ++数组

时间:2012-08-27 08:03:37

标签: c++ arrays heap

如果我在堆上声明一个数组,我怎样才能获得有关该数组的信息?

这是我的代码:

class Wheel
{
public:
    Wheel() : pressure(32)
    {
        ptrSize = new int(30);
    }
    Wheel(int s, int p) : pressure(p)
    {
        ptrSize = new int(s);
    }
    ~Wheel()
    {
        delete ptrSize;
    }
    void pump(int amount)
    {
        pressure += amount;
    }
    int getSize()
    {
        return *ptrSize;
    }
    int getPressure()
    {
        return pressure;
    }
private:
    int *ptrSize;
    int pressure;
};

如果我有以下内容:

Wheel *carWheels[4];
*carWheels = new Wheel[4];
cout << carWheels[0].getPressure();

如何在堆中的数组中的任何实例上调用.getPressure()方法? 另外,如果我想在堆上创建一个Wheel数组,但在堆上创建数组时使用此构造函数:

Wheel(int s, int p)

我该怎么做?

3 个答案:

答案 0 :(得分:2)

Wheel *carWheels[4];

是一个指向Wheel的指针数组,因此您需要使用new:

对其进行初始化
for ( int i = 0; i < sizeof(carWheels)/sizeof(carWheels[0]); ++i)
  carWheels[i]=new Wheel(); // or any other c-tor like Wheel(int s, int p)

以后你可以这样访问它:

carWheels[0]->getPressure();

可以像上面一样检索数组的大小:

sizeof(carWheels)/sizeof(carWheels[0])

[编辑 - 更多细节]

如果你想坚持使用数组,你需要在函数调用时传递它的大小,因为数组会衰减到指针。您可能希望遵循以下语法:

void func (Wheel* (arr&)[4]){}

我希望是正确的,因为我从不使用它,但最好切换到std :: vector。

同样在数组中使用裸指针时,您必须记住在某些时候删除它们,同时数组也不能保护您免受异常的影响 - 如果发生任何异常,您将继续使用内存泄漏。

答案 1 :(得分:0)

简单,替换

Wheel *carWheels[4];

std::vector<Wheel*> carWheels(4);
for ( int i = 0 ; i < 4 ; i++ )
   carWheels[i] = new Wheel(4);

您似乎对()[]感到困惑,我建议您研究一下。

你知道ptrSize = new int(30);没有创建数组,对吗?

答案 2 :(得分:0)

与C一样,你需要通过分配来获取数组的元素数。

在某些情况下,此信息实际上是由实施方式存储的,但不是以您可以访问的方式存储的。

在C ++中,我们支持std :: vector和std :: array等类型。


其他说明:

ptrSize = new int(30); << creates one int with a value of 30
  

我该怎么做?        Wheel(int s,int p)

通常,如果您有现有元素,则只需使用赋值:

wheelsArray[0] = Wheel(1, 2);

因为使用非默认构造函数创建数组会遇到困难。

当我们在这里时:

std::vector<Wheel> wheels(4, Wheel(1, 2));
如果您使用向量,则只需创建4轮所需的

- 不需要new。不需要delete。加上,矢量知道它的大小。