c++ - 虚拟类: are pointers the clean way to go?的 vector

标签 c++ pointers vector virtual concrete

注意: 这几乎是该条目的重复: Abstract classes and Pointers

我需要创建一个虚拟类 vector 。这里的想法是:

#include <vector>
using namespace std;

class VirtualFoo {
protected:
    VirtualFoo();
    virtual ~VirtualFoo();
public:
    virtual void doStuff()=0;
};

class ConcreteFoo: public VirtualFoo {
public:
    ConcreteFoo(double a);
    virtual ~ConcreteFoo();
    void doStuff();
private:
    double a;
};

class Foo {
public:
    Foo(std::vector<VirtualFoo> foos);
    virtual ~Foo();
    void doAllStuff();
protected:
    std::vector<VirtualFoo> foos;
};

我想这样使用它:

int main(int argc, char *argv[]){

    std::vector<ConcreteFoo> cfoos;
    cfoos.push_back(ConcreteFoo(1.0));
    cfoos.push_back(ConcreteFoo(2.0));

    Foo foo = Foo(cfoos);
    foo.doAllStuff();

}

当然这不起作用,因为 cfoos 是 VirtualFoo 而不是 ConcreteFoo 的 vector 。

现在,如果我不使用 VirtualFoo vector ,而是使用 VirtualFoo* vector 并将指针推回到 ConcreteFoo 实例,那么似乎工作得很好。

只是,我不确定这是最干净的方法。更像是我没有想到任何其他方法来做到这一点。这样做可以吗?

最佳答案

指针为 std::vector<VirtualFoo*> cfoos; 的 vector 很好。您无法实例化抽象类,因此编译器无法实例化或专门化使用抽象类作为值的 vector 模板。用基类指针指向元素是可以的,这就是里氏替换原则( http://en.wikipedia.org/wiki/Liskov_substitution_principle )

我同意其他人的评论,即共享指针是更好的解决方案,这样您就不必担心内存管理:

std::vector<shared_ptr<VirtualFoo>> cfoos;  
cfoos.push_back( shared_ptr<VirtualFoo> (new ConcreteFoo(1.0)) );   
cfoos.push_back( shared_ptr<VirtualFoo> (new ConcreteFoo(2.0)) );

关于c++ - 虚拟类: are pointers the clean way to go?的 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15471193/

相关文章:

c++ - for循环中的条件不执行

c++ - 读写二进制文件

c - 使用递归读入一行并返回指向该字符串的指针

c - 从指针访问结构

c++ - 排序然后搜索( vector C++)

c++ - qt中QGraphicsScene中的绘画

c++ - QSettings : is there a limit in . ini文件行长度?

无法找出此段错误的原因

c++ - 在 C++ 中将大数据 vector 写入/读取到二进制文件

c++ - 如何将 vector 插入多维 vector ?