0

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

这是我的代码:

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)

我该怎么做呢?

4

3 回答 3

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。

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

于 2012-08-27T08:08:51.510 回答
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);不会创建一个数组,对吧?

于 2012-08-27T08:09:26.193 回答
0

与 C 一样,您需要将数组的元素计数与分配一起移动。

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

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


其他注意事项:

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

我该怎么做呢?轮子(int s,int p)

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

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

因为您将面临使用非默认构造函数创建数组的困难。

当我们在它的时候:

std::vector<Wheel> wheels(4, Wheel(1, 2));

如果您使用矢量,这就是创建 4 个轮子所需的全部 -new不需要。不需要delete。另外,vector 知道它的大小。

于 2012-08-27T08:11:40.780 回答