C++中如何组成一个具有成员的类,这些成员是具有扩展的类型?以一辆汽车为例。我们有Car
和BigCar
。Car
带有Engine
,但BigCar
应该带有BigEngine
。但是,如果我们只是用BigEngine
隐藏BigCar
的engine
成员,则仍将创建常规Engine
,并且可能在构建过程中做一些我们不希望做的事情。有更好的方法吗?或者是唯一的方法";在施工期间不要做任何事情"我知道我们可以使用DIC,但我认为有一个非常明显的方法我没有想到。。。
示例
#include <iostream>
class Engine {
public:
Engine() {
this->cylinders = 4;
}
virtual ~Engine() {}
int cylinders;
};
class BigEngine : public Engine {
public:
BigEngine():Engine() {
this->cylinders = 8;
this->fuel_injector = true;
}
bool fuel_injector;
};
class Car {
public:
Car() {
std::cout << this->engine.cylinders;
}
virtual ~Car(){ }
Engine engine;
};
class BigCar : public Car {
public:
BigCar():Car() {
std::cout << this->engine.fuel_injector;
}
~BigCar() { }
BigEngine engine;
};
int main()
{
BigCar car; // SHOULD print 81 but prints 41
}
使用模板:
#include <iostream>
class Engine {
public:
Engine() : cylinders{4} {}
int cylinders;
};
class BigEngine : public Engine {
public:
BigEngine() : Engine{}, fuel_injector{true} {
this->cylinders = 8;
}
bool fuel_injector;
};
template<typename E = Engine>
class Car {
public:
Car() {
std::cout << this->engine.cylinders;
}
E engine;
};
class BigCar : public Car<BigEngine> {
public:
BigCar(): Car<BigEngine>{} {
std::cout << this->engine.fuel_injector;
}
};
int main()
{
BigCar car;
}
不过,这样做的问题是,不会有一个单独的Car
类。不过,如果要在Car
中存储不同类型的引擎(具有不同大小的类型(,则需要存储指针。例如:
#include <iostream>
#include <memory>
class Engine {
public:
Engine() : cylinders{4} {}
int cylinders;
};
class BigEngine : public Engine {
public:
BigEngine() : Engine{}, fuel_injector{true} {
this->cylinders = 8;
}
bool fuel_injector;
};
class Car {
public:
Car() : Car{std::make_unique<Engine>()} {
}
std::unique_ptr<Engine> engine;
protected:
Car(std::unique_ptr<Engine> engine) : engine{std::move(engine)} {
std::cout << this->engine->cylinders;
}
};
class BigCar : public Car {
public:
BigCar(): Car{std::make_unique<BigEngine>()} {
std::cout << static_cast<BigEngine*>(this->engine.get())->fuel_injector;
}
};
int main()
{
BigCar car;
}
您的Car
类可以有一个指向Engine
的指针,并且可以在constructo中创建适当的引擎。当你必须添加电动时,这将照顾到不同的发动机类型:(