虚拟类的向量:指针是干净的方法吗
Vector of virtual class : are pointers the clean way to go?
注意:这几乎是此条目的重复:抽象类和指针
我需要创建一个虚拟类的向量。这里的想法:
#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的实例,这似乎很好。
只是,我不确定这是最干净的方式。这更像是我没有想到任何其他方式来做这件事。这样做可以吗?
指针为std::vector<VirtualFoo*> cfoos;
的向量很好。您无法实例化抽象类,因此编译器无法实例化或专门化使用抽象类作为值的向量模板。用基类指针指向元素是好的,这就是Liskov替换原理(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)) );
相关文章:
- 将一个类的方法指针存储到另一个类中
- 如何调用返回类方法指针的类方法
- 通过reinterpret_casting方法指针从指针调用派生类的方法。这是 UB 吗?
- 泛型方法指针.reinterpret_cast指向不同类的方法指针,这是 UB 吗?
- C++;类方法指针;λ;将 lambda 作为成员函数指针传递;
- 使用模板、方法指针和字符串键入推导
- 将方法指针作为整数参数发送到C#的C 方法
- 从C 中的VTable获取方法指针
- 模板化方法指针 - 无法匹配函数参数的指针
- 获取特定的模板重载方法指针
- 如何将方法指针声明为Typedef方法参数
- 如何将方法指针类型转换为函数指针类型
- 如何在使用 pthreads 时将方法指针作为函数参数传递C++
- 方法指针映射,编译器说他们不接受任何参数
- C# 方法指针,如 C++ 中的指针
- c++创建新的LinkedList类:Clear()方法指针被释放未分配
- 尝试获取类方法指针时出现E_NOINTERFACE
- 传递和强制转换方法指针
- 常量方法指针的类型是什么
- 将对象的方法指针传递给接受 [静态方法指针/全局函数] 指针的函数