gpt4 book ai didi

c++将类映射到数字

转载 作者:搜寻专家 更新时间:2023-10-31 01:30:24 26 4
gpt4 key购买 nike

我最近开始进行 C++ 开发。我遇到了一个我无法解决的问题,因为我不知道以下是否可行。

I want to create a mapping between a number and class, which are derived from an abstract class.

基本上我想做的是创建一个工厂方法,该方法可以根据与该类关联的给定数字创建该类的新实例。

我知道我可以做以下事情......

Vehicle *Vehicle::from_type(byte type)
{
switch(type)
{
case 0x00: return new Bicyle();
case 0x01: return new Car();
...
case 0x10: return new Truck();
}

return null;
}

...,但我宁愿不这样做,因为我想保持干燥。

有一种方法可以按照以下方式做一些事情:

// I know this is incorrect syntax
const map<byte, class extends Vehicle> VEHICLE_MAPPING = {{0x00, Bicyle}, {0x01, Car}, ..., {0x10, Truck}};

Vehicle *Vehicle::from_type(byte type)
{
return new VEHICLE_MAPPING[type]();
}

最佳答案

我可以看到您的方法如何与 std::map<uint8_t, std::unique_ptr<Vehicle>> 一起使用, 但有一个问题 - 您将无法使用 initializer_list 初始化该 map ,因为它复制元素,而且众所周知,std::unique_ptr无法复制。你必须创建一个 init()函数来初始化将使用与您的 Vehicle *Vehicle::from_type(byte type) 类似逻辑的 map ,这将毫无意义,因为您已经拥有自己的功能。

此外,我不同意您的第一个解决方案违反了 DRY。从某种意义上说,您不会被迫使用 switch 实际上是正确的或 if s 在代码的其他地方。我肯定会坚持下去。

最后一点——你可以使用std::map<uint8_t, std::shared_ptr<Vehicle>>而不是 std::map<uint8_t, std::unique_ptr<Vehicle>>并用 initializer_list 初始化它, 自 std::shared_ptr 可以被复制,但我不建议这样做,因为它错误地指示了 shared_ptr 的用法。 .如果你不知何故感到被迫这样做,这里有一个例子:

class Base{ public: virtual ~Base() = default; };
class Derived1 : public Base{};
class Derived2 : public Base{};

class derived_factory{
private:
derived_factory();
static inline std::map<uint8_t, std::shared_ptr<Base>> base_map = {
{0x00, std::make_shared<Derived1>()},
{0x01, std::make_shared<Derived2>()}
};
public:
static std::unique_ptr<Base> from_type(uint8_t type)
{
return std::make_unique<Base>(*base_map[type]);
}
};

int main()
{
auto ptr = derived_factory::from_type(0x00);
// ptr is of a type std::unique_ptr<Base> and points to Derived1 object
}

附加注意事项应该是使用此解决方案的最后一个阻碍是它非常慢。它在 map 中构造对象,除了将它们保留为“模板化”拷贝示异常(exception),不对它们执行任何操作。

关于c++将类映射到数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48008294/

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