-1

C ++如何使用数组在类中创建子类

大家好,我还在学习 C++ 并在这里遇到一些问题。

基本上我有一个父类

让我们将此父类称为

Vehicle

它有 2 个子类,假设它们是

Car and Motorcycle

我将创建一个车辆对象,假设车辆大小为 20

Vehicle veh[20]

我将执行以下操作

string vType;

cout << "Please enter your vehicle Type:";
cin >> vType;

所以我做一个比较 if (vType=="Car")

它将从子类返回 4 个轮子,但是我如何在 Car 和 Motorcycle 声明它的 4 个轮子和 2 个轮子,我知道我需要创建 2 个额外的 cpp 文件

class Car : public Vehicle
{
private:
int noOfWheels;
public:
computePrice();
}

但是我如何将 noOfWheels 专门设置为 Car 为 4 和 Motorcycle 为 2。

接下来是棘手的部分..在知道它有多少个轮子之后

我需要为每个轮子存储一个数组

string wheel[4];

因为我知道汽车有 4 个轮子。

我如何提示 4 种类型并将其存储在一个数组中,并将所有这些都存储在一个名为 Vehicle 的对象中。

我可以使用 for 循环,这不是问题,我坚持的部分是我如何创建一个字符串数组并将 4 提示存储,然后存储到这个 Vehicle[0]

wheel 1:
wheel 2:
wheel 3:
wheel 4:

当用户想要打印数据时,它将是

Vehicle[0]
Type: Car
Wheel: 4
Wheel[0] = Fine condition
Wheel[1] = Need to check again
Wheel[2] = Fine condition
Wheel[3] = Might need get repair

感谢所有帮助。

4

2 回答 2

3

首先,您的数组的声明是错误的。由于您正在处理多态类,因此您需要使用指针。

Vehicle* veh[20];

否则,您将拥有所谓的对象切片。这意味着即使您创建 aCar或 a在您将它们分配给数组时Motorcycle它们也会被转换为s 。Vehicle

“我如何将 noOfWheels 专门设置为 Car 为 4 和 Motorcycle 为 2。”

在构造函数中

class Car : public Vehicle
{
public:
    Car() : noOfWheels(4) { ... }
private:
    int noOfWheels;
    ...
};

class Motorcycle : public Vehicle
{
public:
    Motorcycle() : noOfWheels(2) { ... }
private:
    int noOfWheels;
    ...
};

但就我个人而言,我认为您根本不需要 noOfWheels 数据成员。由于每种车辆的轮子数量是固定的,因此浪费空间,因此您需要一个虚函数

class  Vehicle
{
public:
    virtual int noOfWheels() const = 0;
    ...
};

class Car : public Vehicle
{
public:
    virtual int noOfWheels() const { return 4; }
    ...
};

class Motorcycle  : public Vehicle
{
public:
    virtual int noOfWheels() const { return 2; }
    ...
};

'我如何创建一个字符串数组并将 4 提示存储到这个 Vehicle[0]'

我将再次使用构造函数来初始化车轮名称。

class Car : public Vehicle
{
public:
    Car(const std::string* w)
    { wheel[0] = w[0]; wheel[1] = w[1]; wheel[2] = w[2]; wheel[3] = w[3]; }
    virtual int noOfWheels() const { return 4; }
private:
    std::string wheel[4];
    ...
};

使用构造函数来初始化类。这就是他们的目的。

于 2012-10-25T09:22:48.107 回答
3

看起来答案已被接受,但我全部输入了,所以我会全部发布。我猜这是OOP的失败。

让我们假设所有车辆都有轮子。所有这些轮子都有一个条件。有些车辆的轮子比其他车辆多或少。

您需要将类的公共方面分成更高的顺序,分成基类。

您还需要组织您的类以与其他类组合以构建一个整体。

这里我们有一个轮子类,它有一个condition,它是一个字符串。您可以随时查询它的状况。

class Wheel 
{
  public:
    const std::string GetCondition() const { return mCondition; }
  private:
    std::string mCondition;
};

我们知道车辆会有轮子,所以我们将轮子容器存储在这里,以便通过继承在子类之间共享。

class Vehicle
{
  public:
    Vehicle(unsigned int wheelCount) { mWheels.resize(wheelCount, Wheel()); }
    virtual unsigned int GetWheelCount() { return mWheels.size(); }
    virtual const std::string GetWheelCondition(int wheelNumber)
    {
      return mWheels[wheelNumber].GetCondition();
    }
  protected:
    std::vector<Wheel> mWheels; // All vehicles have wheels.
};

汽车是一种Vehicle因此它继承Vehicle. 它继承了一个保存Wheel对象的成员。它还继承了有助于查找车轮计数通过索引获取车轮状态的方法。这是您可以专攻课程的级别。和类都有轮子,它们具有相同的核心功能CarMotorbike我们可以通过添加或重载方法来专门化该类。

class Car : public Vehicle
{
  public:
    Car() Vehicle(4) {}
    Car(unsigned int wheelCount) : Vehicle(wheelCount) {}
}

class Motorbike : public Vehicle
{
  public:
    MotorBike(unsigned int wheelCount) : Vehicle(wheelCount) {}
    void DoWheelie() { throw; }
}

我们可以像这样使用这些对象,

Car car(4); // Car with 4 wheels. specialized constructor.
Car standardCar(); // Car with 4 wheels, as default constructor.
Car uberCar(42); // Car with 42 wheels.    
Motorbike bike(2); // Bike with 2 wheels.
Motorbike badBike(); // No default constructor defined! Will not compile!

car.GetWheelCount(); // 4
bike.GetWheelCount(); // 2

bike.DoWheelie(); // All good.
car.DoWheelie(); // NOPE! Method doesn't exist for this.

关于多态性和堆分配的好处还有很多要说的,但我想我会留在这里。希望它有帮助。

于 2012-10-25T09:47:05.687 回答