【发布时间】: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