C ++无法分配抽象类型的对象

时间:2014-11-13 02:11:51

标签: c++ abstract

我是C ++的新手,知道这个错误是什么。代码如下。

问题:

  1. 我在另一篇文章中读到了使用指向抽象基类的指针, 但如何在没有动态分配的情况下这样做?
  2. 我可以使用引用代替吗?我试过了,没用。
  3. 我可以使用联合{Circle c,Shape s} ;?我试过了,没用。
  4. 在下面的示例中,Circle和Square继承自抽象基类Shape。

    int main()
    {
      std::vector<Shape> shapes; //Error!
      Circle c (5);
      Square s(4);
      shapes.push_back(c);
      shapes.push_back(s);
      return 0;
    }
    

2 个答案:

答案 0 :(得分:3)

显然你已经将Shape类型定义为一个抽象类型,其中Circle和Square是从Shape派生的类型。

您通常会做的是;

std::vector<Shape*> shapes ;

并使用形状矢量将搬运工存储到正方形和圆形。

  shapes.push_back (&c) ;
  shapes.push_back (&s) ;

答案 1 :(得分:1)

如果您正在使用对象,则存储指向向量中这些对象的指针。指针只是引用对象在内存中的位置。当您使用关键字“new”时,内存分配器会返回指向已分配内存的指针。

vector<Shape*> shapes;     // EDIT: I originally some bad syntax here

Circle *c = new Circle(5); // variable c is a pointer, that points to a type Circle
Square *s = new Square(4); // variable s is a pointer, that points to a type Square

shapes.push_back(c);       // stores pointer c into array
shapes.push_back(s);       // stores pointer s into array

如果您使用存储在堆栈中的数据,那么您可以使用'&amp;'获得指向结构地址的指针。符号

vector<Shape*> shapes;     // EDIT: I originally some bad syntax here

Circle c(5);               // Circle structure on the stack
Square s(4);               // Square structure on the stack

shapes.push_back(&c);       // stores pointer c into array
shapes.push_back(&s);       // stores pointer s into array