如果我在堆上声明一个数组,我怎样才能获得有关该数组的信息?
这是我的代码:
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)
我该怎么做?
答案 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
。加上,矢量知道它的大小。