使用具有扩展类型的成员组合C++类

  • 本文关键字:成员 组合 C++ 类型 扩展 c++
  • 更新时间 :
  • 英文 :


C++中如何组成一个具有成员的类,这些成员是具有扩展的类型?以一辆汽车为例。我们有CarBigCarCar带有Engine,但BigCar应该带有BigEngine。但是,如果我们只是用BigEngine隐藏BigCarengine成员,则仍将创建常规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中创建适当的引擎。当你必须添加电动时,这将照顾到不同的发动机类型:(

最新更新