提问者:小点点

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


我正在尝试创建一个程序,接受食物订单并将其打印出来。 我的基类food中有一个纯虚拟函数。 食物类有两个子类披萨甜点。 我正在尝试在我的main中制作一个food数组,这样当顾客订购pizzadessert时,它将存储在food数组中。 但每次尝试,我都会出错。 那么,如果我想使用循环来检查客户订购的每一个项目,我应该如何将这两个项目放在一起呢? 这是我的代码:

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

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

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};
                  ^

共3个答案

匿名用户

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

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

然后使用数组

array[0]->print_food();

匿名用户

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

我认为std::array,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();

不幸的是,它不能仅从{}中推导出正确的类型,但是我想可以创建一个helper,

匿名用户

从C++11开始,您也可以使用std::reference_wrapper。 和@Mykola的回答很像,但使用了引用:

#include <functional>  // for std::reference_wrapper

int main()
{
  Dessert d("brownie");
  Pizza p("BBQ delux");
  std::reference_wrapper<Food> array = {d, p};

  // just to see they're references, they have same memory addresses as
  // the initial variables.
  for (const Food &f : array) {
    std::cout << &f << " ";
  }
  std::cout << "\n" << &d << " " << &p << "\n";
}

不幸的是,同样的限制也适用于此版本和带有指针的版本。 你需要有局部变量定义,你不能仅仅使用匿名对象在这里。

这不起作用:

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

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(何在|c++|中|创建|抽象类|数组)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?