不同子类的构造函数中的个性化名称

时间:2014-11-08 17:08:57

标签: c++ arrays constructor compiler-errors

取代" Car"有没有办法根据每个对象的类设置名称变量,例如" Turbo 01"或"坦克02"或者" Buggy 03",其中id包含创建的车辆数量。

#include <iostream>
#include <string>
#include <sstream>
static int id = 0; //Total Number of cars right now
class Car
{

private:
        std::string name;
Car()
    {
      std::ostringstream tmp;
      std::string temp;
      tmp << "Car" << ++id;
      temp = tmp.str();
    }
Car(std::string name){this->name=name; id++;}

};

class Turbo : public Car()
{

Turbo():Car()
    {

    }
Turbo(std::string name):Car(name);
    {

    }
};

1 个答案:

答案 0 :(得分:1)

首先,让我们通过提供两个必需的模板参数std::array来确保class Car编译:类型和大小。例如:std::array<int, 10>

问题是Turbo需要一个有效的构造函数用于其基类型Car才能执行任何其他操作。它有两种方式可供使用:

  • 要么设计Car,以便有默认的consructor(即没有参数)
  • 或者您将Car的构造函数放在Turbo的初始化列表中。

对于您编辑过的问题,问题是Car构造函数必须对派生类可见,因此publicprotected,而不是private。您还可以使用默认参数来删除冗余代码。

这是一个解决方案:

class Car
{
private:
    static int id;     //Total Number of cars right now  SO MEK IT a static class member
    std::string name;

public:     // public or protected so that derived classes can access it
    Car(std::string n="Car")  // if a name is provided, it will be used, otherwhise it's "Car".
    {
        std::ostringstream tmp;
        std::string temp;
        tmp << n << ++id;
        name = tmp.str();  // !! corrected
    }
};
int Car::id = 0;   // initialisation of static class member

class Turbo : public Car
{
public:                                    // !! corrected
    Turbo(std::string n="Turbo") :Car(n)   // !!
    {   } 
};