【问题标题】:Is it possible to create an array of constructors in C++?是否可以在 C++ 中创建构造函数数组?
【发布时间】:2021-04-25 14:14:15
【问题描述】:

我正在努力提高编写 C++ 代码的能力,并想知道这样的事情是否可行:

我在一个指令集中有 256 条指令。 它们都具有完全不同的行为但具有共同的属性,因此我考虑创建 256 个特定类,这些类将继承一个称为指令的通用类。 然后我想将每个类的构造函数(或者,甚至一对构造函数)存储到一个大小为 256 的数组中,并通过执行以下操作简单地创建指令: 指令 instr = constructorsOPCode;

这可能吗?这是解决这个问题的好方法吗?

【问题讨论】:

  • 根据n3337,构造函数是一个函数。您还可以生成您的一些 C++ 代码(使用 GNU m4GPPSWIGANTLRGNU bison 等工具等)。没有一些minimal reproducible example,你的问题就不清楚了。
  • 没有和没有(尽管使用 256 数组是完全合理的)。第一个否是因为您不能在任何地方存储构造函数,它们不是常规函数。当然,您可以使用常规函数作为“构造函数”。第二个不,因为您的方法会受到对象切片的影响。创建派生类型对象后,您将分配给基类型,因此您将丢失所有派生类型信息。也许这是您设计的一部分,在这种情况下,我想知道是否有派生类型。只需要基本类型和构造基本类型版本的函数。
  • 您可能想研究一个工厂模式
  • 您可以阅读a good C++ programming book 和这个C++ reference 并使用C++ lambda expressions现有开源 C++ 项目中汲取灵感(例如FLTKRefPerSysfishQt....)
  • 使用巨大的 switch 语句有什么问题?我认为,除非您提供一个具体示例来说明您要实现的目标,否则任何事情都会摆在桌面上,这听起来像是 XY 问题。

标签: c++ arrays class constructor


【解决方案1】:

不,你不能有一个构造函数数组,这无论如何都不是你想要的,构造函数只是初始化对象,它不会创建它。您可以创建一个工厂函数数组来创建对象:

std::vector<std::function<std::unique_ptr<Instruction>()>> constructors = 
{
  []{ return std::make_unique<Instruction1>(); },
  []{ return std::make_unique<Instruction2>(); },
  []{ return std::make_unique<Instruction3>(); },
};

std::unique_ptr<Instruction> instruction = constructors[constructorsOPCode]();

根据您的具体用例,shared_ptr 可能比 unique_ptr 更合适。

【讨论】:

    【解决方案2】:

    是否可以在 C++ 中创建构造函数数组?

    没有。构造函数不是对象,所以它不能是数组的元素。

    也不可能用函数指针指向构造函数,因此函数指针数组没有用处。此外,每个构造函数都会有不同的签名,并且数组是同构的,所以无论如何你不能将具有正确类型的指针存储在一个数组中。


    继承一个名为 Instruction 的通用类

    并通过执行以下操作来简单地创建指令:Instruction instr = constructorsOPCode;

    如果你创建一个基类的对象,那么它就不是派生类型,所以这是行不通的。

    您似乎正在尝试发明一个多态工厂。像这样的东西可以工作:

    std::unique_ptr<Instruction>
    makeInstruction(int op)
    {
        switch(op) {
            case 0: return std::make_unique<SomeInstruction>();
            case 1: return std::make_unique<AnotherInstruction>();
            ...
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-01
      • 2021-11-15
      • 2020-03-08
      • 2012-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多