赋值的下一部分告诉我,类RacingCar
包含由Wheel类定义的四个轮对象。将轮子实现为堆上的对象数组。
class RacingCar{
int speed;
public:
void Accelerate(int value) {
speed = speed + value;
}
void Brake(int value) {
speed = speed - value;
}
void Turn(int value) {
speed = value / 4;
}
void Print(){
cout << "The current KM/h of the car is: " << speed;
}
};
class Wheel {
int *ptrSize;
int pressure;
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;
}
void print() {
cout << pressure;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
Wheel *heapArray = new Wheel[4];
RacingCar F1; //Creating a "Formula 1" test car
//Test parameters
F1.Accelerate(10);
F1.Brake(50);
F1.Turn(180);
F1.Print(); //Checks to see if the car changes actually worked
getch();
delete [] heapArray; //Delete when you're done
return 0;
}
构建像这样的类,然后在RacingCar
内访问它是否理想?或者有更好的方法吗?我无法看到在堆上创建它的方法。
答案 0 :(得分:3)
将轮子实现为堆上的对象数组。
真的有点无趣,但这是一个练习,所以......
赋值告诉我,类“RacingCar”包含四个轮子对象,由Wheel类定义。
当你的作业说“包含四个轮对象”时,你可以将这个要求翻译成“轮对象应该是我班级的成员”。
我假设你的教练希望你在RacingCar类的ctor中初始化wheel-object-array,然后在RacingCar类的dtor中释放它(delete[]
)。
但请注意,执行此操作的正确方法是:
class Wheel;
class RacingCar {
...
std::vector<Wheel> wheels; // if you need a variable amount of wheels
Wheel wheels[4]; // if you need exactly 4 wheels.
...
即使你真的必须在堆上分配Wheel对象,你仍然不会使用delete[]
,但最好使用boost::scoped_array
之类的工具。
让我们充实一点,因为我们想要SO的完整答案,即使对于“家庭作业”问题,对吗?
如上所述,建模包含通常是通过类的成员完成的,尽管在这种情况下,类的成员可能是某种类型的数组。
鉴于要求在堆上分配Wheel (虽然它对玩具示例没有意义,但是有很多合法的用例来分配类的对象成员方案中的堆) - 我会说以下解决方案是好风格:
这将为您提供一个恰好有4个堆分配对象的数组。您不需要明确释放这些内容:
class RacingCar {
...
boost::scoped_array<Wheel> wheels;
...
RacingCar()
: wheels(new Wheel[4])
{ }
...
这使用了4个单独的成员,这些成员在某些用例中可能有意义,在这些用例中,您拥有相同类的成员,但不要统一使用它们:
class RacingCar {
...
boost::scoped_ptr<Wheel> front_left;
boost::scoped_ptr<Wheel> front_right;
boost::scoped_ptr<Wheel> rear_left;
boost::scoped_ptr<Wheel> rear_right;
...
RacingCar()
: front_left(new Wheel)
, front_right(new Wheel)
, rear_left(new Wheel)
, rear_right(new Wheel)
{ }
如果您想使用可变尺寸,您可以:
class RacingCar {
...
boost::ptr_vector<Wheel> wheels;
...
RacingCar() {
for(size_t i=0; i<4; ++i) {
wheels.push_back(new Wheel);
}
}
...
最后,如果你没有提升但是普通的C ++,我会这样做:(哦,请注意我在第一版中如何忘记添加副本ctor operator。这就是你不去搞乱原始指针和删除的原因。你永远都会忘记......; - )
class RacingCar {
...
Wheel* wheels;
...
RacingCar()
: wheels(new Wheel[4])
{ }
~RacingCar() {
delete[] wheels;
}
private:
// Block copy operations. These would need to be
// implemented properly for the wheels member.
RacingCar(RacingCar const&); // no impl.
RacingCar& operator=(RacingCar const&); // no impl.
...
答案 1 :(得分:2)
分配意味着Wheel
的数组应该是类RacingCar
的一部分,就像
class RacingCar {
public:
...
private:
...
Wheel *wheels;
};
你应该在构造函数中分配它,然后在析构函数中销毁它。
答案 2 :(得分:1)
我认为最好将“* heapArray”添加为RacingCar的属性并在其构造函数中创建轮子。