代码之家  ›  专栏  ›  技术社区  ›  San Jacinto

stl vector.push-back()抽象类未编译

  •  3
  • San Jacinto  · 技术社区  · 15 年前

    假设我有一个包含类类型“xx”的stl向量。xx是抽象的。我遇到了这样一个问题:当我执行如下操作时,编译器不允许我“实例化”:

    std::vector<xx> victor;
    void pusher(xx& thing)
    {
        victor.push_back(thing);
    }
    
    void main()
    {
        ;
    }
    

    我认为这是因为必须调用复制构造函数。我通过将xx*存储在向量而不是xx*中来解决这个问题。有更好的解决方案吗?这是怎么一回事?

    3 回复  |  直到 15 年前
        1
  •  12
  •   Steve Guidi    15 年前

    当你使用 push_back ,您正在复制对象并将其存储在向量中。正如您所猜测的,这不起作用,因为您不能实例化抽象类,这基本上就是复制构造所做的。

    建议使用指针,或者使用库中可用的许多智能指针类型之一,如 boost loki .

        2
  •  2
  •   Eugen Constantin Dinca Chris Lohfink    15 年前

    要比教皇(或者在本例中是SteveGuidi)更为天主教,对存储在STL容器中的对象的要求是它们是可复制构造和可分配的,而抽象类两者都不是。所以在这种情况下,一个指针容器是可行的。 如果您决定通过不使类变为抽象的方式来修复问题,那么需要考虑的另一件事是 slicing .

        3
  •  0
  •   AProgrammer    15 年前

    std::vector(通常是整个stl)用于存储值。如果您有一个抽象类,那么您并不打算操纵这种类型的值,而是操纵指针或对它的引用。所以抽象类的std::vector没有意义。即使它不是抽象的,通常也没有意义将设计为基类的类作为值来操作,它们通常应该是不可查看的(复制构造函数和赋值运算符声明为私有的,而不实现是标准技巧,它继承自一个合适的类,其唯一目的是使其后代不可复制--例如,不可复制——已经成为时尚。