如何在c中创建抽象类的数组

新手上路,请多包涵

我正在尝试创建一个程序来接受食物订单并将其打印出来。我有我的基类 Food 其中有一个纯虚函数。食品类有 2 个子类 PizzaDessert 。我正在尝试在我的 main Food 的数组,所以当客户订购 PizzaDessert 时,它将被存储在 —1cc75bfea8405f101 中 Food 的数组。但每次我尝试,我都会得到一个错误。如果我想使用循环遍历客户订购的每件商品,我应该如何将这两个商品放在一起?这是我的代码:

 int main()
{
  Dessert d("brownie");
  Pizza p("BBQ delux");
  Food array[2] = {d,p};
}

这是我的错误信息。 (注意: get_set_price()print_food() 是我在基类中定义并在 2 个子类中实现的纯虚函数)

 main.cpp:37:14: error: invalid abstract type ‘Food’ for ‘array’
  Food array[2] = {d,p};

In file included from main.cpp:4:0:
Food.h:5:7: note:   because the following virtual functions are pure within ‘Food’:
 class Food
       ^

Food.h:20:15: note:     virtual void Food::get_set_price()
  virtual void get_set_price()=0;
               ^

Food.h:27:15: note:     virtual void Food::print_food()
  virtual void print_food()=0;
               ^

main.cpp:37:22: error: cannot allocate an object of abstract type ‘Food’
  Food array[2] = {f,o};
                  ^

原文由 Safwan Ull Karim 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 620
2 个回答

您不能创建抽象类的实例,但可以将具体派生实例的指针或引用分别分配给基类的指针或引用。

 int main()
{
  Dessert d("brownie");
  Pizza p("BBQ delux");
  Food* array[2] = {&d,&p};
}

然后使用 array

 array[0]->print_food();

原文由 Mykola 发布,翻译遵循 CC BY-SA 4.0 许可协议

您需要参考语义,因为 Food arr[2]; 尝试使用默认值初始化数组(这是抽象的,因此不可构造)。

我认为 std::array<std::unique_ptr<Food>, 2> arr; 在这种情况下应该是最自然的使用。

 std::array<std::unique_ptr<Food>> arr = {
    std::make_unique<Dessert>("brownie"),
    std::make_unique<Pizza>("BBQ delux")
};

但是,如果您只想遍历这两个值,我想使用 initializer_list 会是最简单的。

 for (auto f : std::initializer_list<Food*>{&d,&p})
    f->commonMemberFunction();

不幸的是,它不会仅从 {} 推断出正确的类型,但我想可以创建一个助手,

原文由 Bartek Banachewicz 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题