我目前正在研究类中的类继承/多态,我无法弄清楚这个问题。好的,它是:假设我有2个模拟类,我让用户选择一个与构造函数中最后一个参数对应的值:
class Planets {
private:
int x,y,z;
string a;
public:
Planets(string name, int diameter, int mass, int planet_kind) : a(name), x(diameter), y(mass), z(planet_kind) { }
Planets() { a="", x=0, y=0, z=0; }
//get and set functions to manipulate data
virtual void planet_creation(Planets& p1);
//function I want to modify depending on the planet
}
要注意的是planet_kind变量。我希望父类成为其他人的基线,例如,气体巨人将是2,生命的行星将是1等等......他们都将拥有自己的类和构造函数。例如,在另一个类中:
class Gas_giant : public Planets {
private:
int x,y,z;
string a;
public:
Gas_giant(string name, int diameter, int mass, int planet_kind) : a(name), x(diameter), y(mass), z(planet_kind) { }
Gas_giant() { a="Gas", x=0, y=0, z=2; }
//get and set functions to manipulate data
void planet_creation(Gas_giant& g);
//function I want to modify depending on the planet
//example: gas giants would be larger when created,have no solid mass,high gravity
}
基本上我希望用户能够输入行星的种类和名称,然后根据他们选择的种类,调用某些类型的行星以不同的方式随机生成。函数不是问题,我遇到的问题是让我的程序根据基础构造函数中的参数选择不同的构造函数。
我不希望我的程序创建任何“0型”行星,它只是一个我试图从中得到所有其余的类。
提前致谢,如果这是一个愚蠢的问题,对不起。
答案 0 :(得分:2)
有些语言中构造函数可以返回派生类型,但C ++不是其中之一。在C ++中,构造函数总是精确构造自己的类型。
无论如何,使用“planet_kind”整数优于使用不同的构造函数并不明显。不同的构造函数选项可能更具可读性:
Planet* henry = new GasGiant("Henry", ...);
Planet* bob = new Asteroid("Bob", ...);
...
如果由于某种原因(例如从文件中读取数据)确实需要使用枚举,那么您需要一个案例陈述:
for (;;) {
// read data into name, size, mass, kind
planets.emplace_back( make_planet(name, size, mass, kind) );
}
...
Planet* make_planet(std::string name, double radius, double mass, enum PlanetKind kind) {
switch (kind) {
case GIANT : return new GasGiant(name, radius, mass);
case ASTEROID: return new Asteroid(name, radius, mass);
// ...
default: // write an error message
}
}