c++ - assignment - vector data函数




C++:对象的向量与指向新对象的向量的向量? (3)

你不会得到你想要的代码

class World{
    vector<ObjectBaseClass> object_list;
public:
    void generate(){
        object_list.clear();
        object_list.push_back(DerivedClass1());
        object_list.push_back(DerivedClass2());

将要发生的事情称为对象切片。 您将获得ObjectBaseClass的向量。

使多态性工作你必须使用某种指针。 在boost或其他库中可能有一些智能指针或引用可以使用,并使代码比第二个提出的解决方案更安全。

我正在寻求通过编写示例软件渲染器来提高我的C ++技能。 它采用由3d空间中的点组成的对象,并将它们映射到2d视口,并为视图中的每个点绘制不同大小的圆。 哪个更好:

class World{
    vector<ObjectBaseClass> object_list;
public:
    void generate(){
        object_list.clear();
        object_list.push_back(DerivedClass1());
        object_list.push_back(DerivedClass2());

要么...

class World{
    vector<ObjectBaseClass*> object_list;
public:
    void generate(){
        object_list.clear();
        object_list.push_back(new DerivedClass1());
        object_list.push_back(new DerivedClass2());

?? 在第二个例子中使用指针来创建新对象会破坏使用向量的点,因为向量会在第一个示例中自动调用DerivedClass析构函数而不是在第二个示例中调用DerivedClass析构函数吗? 使用向量时是否需要指向新对象的指针,因为只要您使用其访问方法,它们本身就会处理内存管理? 现在让我们说我在世界上有另一种方法:

void drawfrom(Viewport& view){
    for (unsigned int i=0;i<object_list.size();++i){
        object_list.at(i).draw(view);
    }
}

调用时,这将为世界列表中的每个对象运行draw方法。 假设我希望派生类能够拥有自己的draw()版本。 为了使用方法选择器( - >),列表是否需要指针?


嗯,这取决于你试图用你的矢量做什么。

如果你不使用指针,那么它就是你传入的对象的副本 ,它被放在向量上。 如果它是一个简单的对象,和/或你不想打扰它们的存储,这可能正是你想要的。 如果它是构造和破坏的复杂或非常耗时的东西,你可能更喜欢每次只做一次这样的工作并将指针传递给向量。


至于你的第一个问题,通常首选使用自动分配的对象而不是动态分配的对象(换句话说, 存储指针),只要对于有问题的类型,复制构造和分配是可能的并且不会过于昂贵。

如果无法复制或分配对象,那么无论如何都不能将它们直接放入std::vector ,因此问题没有实际意义。 如果复制和/或赋值操作很昂贵(例如,对象存储大量数据),那么出于效率原因,您可能希望存储指针。 否则,通常最好不要存储指针,因为你提到的原因(自动释放)

至于你的第二个问题,是的,这是存储指针的另一个有效理由。 动态调度(虚方法调用)仅适用于指针和引用(并且您不能在std::vector存储引用)。 如果需要在同一向量中存储多个多态类型的对象,则必须存储指针以避免切片。







vector