【问题标题】:Vector of virtual class : are pointers the clean way to go?虚拟类的向量:指针是干净的方式吗?
【发布时间】:2013-03-06 10:58:12
【问题描述】:

注意: 这几乎是此条目的副本: Abstract classes and Pointers

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

#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。

现在,如果我不使用 VirtualFoo 的向量,而是使用 VirtualFoo* 的向量并将指针推回 ConcreteFoo 的实例,那似乎可以正常工作。

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

【问题讨论】:

  • 智能指针向量是一个干净的解决方案,其中特定的智能指针取决于您需要的所有权语义。
  • @juanchopanza 几乎可以肯定为矢量共享?
  • @AlexChamberlain 目前我还不清楚,但我还没有喝过一杯咖啡。
  • @AlexChamberlain 我同意这一点(我在打字的时候猛烈喝咖啡)=P
  • @WhozCraig 同意什么?共享指针? 通常,人们希望对象的生命周期与持有它们的容器的生命周期绑定,因此唯一所有权会更有意义(毕竟客户端不必取得所有权)。跨度>

标签: c++ pointers vector virtual concrete


【解决方案1】:

带有std::vector&lt;VirtualFoo*&gt; cfoos; 指针的向量很好。您不能实例化抽象类,因此编译器无法实例化或专门化使用抽象类作为值的向量模板。用基类指针指向元素很好,这是 Liskov 替换原则(http://en.wikipedia.org/wiki/Liskov_substitution_principle)

我同意其他人的 cmets 共享指针是更好的解决方案,因此您不必担心内存管理:

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)) );

【讨论】:

    猜你喜欢
    • 2013-10-13
    • 2016-10-27
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-19
    • 1970-01-01
    • 2019-11-18
    相关资源
    最近更新 更多