gpt4 book ai didi

c++ - 在 C++ 中先验未知子类类型的模型类/子类

转载 作者:行者123 更新时间:2023-11-30 05:02:29 24 4
gpt4 key购买 nike

我正在使用 C++。Vehicle 是一个类,CarTruckShip 是它的子类。

假设我有一个文件 file.vechicle 包含关于 Vehicle 对象的信息,这个文件的第一个信息是车辆是否是 汽车卡车轮船

文件的格式根据文件所描述的车辆而变化。

我在 Vehicle 中定义了一个静态方法,它将一个 .vehicle 文件作为输入,然后它确定该文件是否描述了一个 CarTruckShip 等它调用相应类中的私有(private)方法以从文件构建对象。最后,静态方法返回正确的对象,如果文件描述的是汽车,则返回 Car,依此类推。

是否可以在不引入静态方法的情况下实现同样的事情,因此只需调用 Vehicle 的构造函数并让 Vehicle 根据文件?

最佳答案

不,C++ 对象不会改变它们最派生的类型(这种行为或多或少可以很容易地模拟,像往常一样,以一些性能成本和遵循约定的代价)。您正在使用某种工厂模式,在 C++(和许多其他语言)中,它的典型实现是通过返回装箱多态类型的静态方法完成的。

一个典型的解决方案是Vehicle 类型在内部封装具体实现。这甚至允许构建它:

class Carrier {
public:
virtual void go() = 0;
virtual ~Carrier() {}
};

class Car: public Carrier;
class Ship: public Carrier;

struct Vehicle /* you can even add ': Carrier' here, just don't make Vehicle run on itself */
{
Vehicle(std::string const &spec): impl(spec == "car"? new Car : new Ship) {}
void go() { return impl->go(); }
private:
std::unique_ptr<Carrier> impl;
};

关于c++ - 在 C++ 中先验未知子类类型的模型类/子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49877940/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com