我有一个c ++类:
Class farm {
...
protected:
vector<ff_node*> workers;
};
//ff_node an abstract method representing a single thread
class ff_node {
protected:
//svc is the method to encapsulate a sequential function
void* svc(void *)=0;
};
Class farm_withMoreWorkers: public farm {
void addWorker(){
ff_node *newWorker;
newWorker=new ff_node();// rather than adding ff_node make the instance type as that of type workers since ff_node is abstract
farm:: workers.push_back(newWorker);
}
};
类ff_node是抽象的。为了再添加一个worker,我需要创建一个类型与其他类型相同的新实例(所有worker都属于同一类型) 有没有办法获得特定类型的(一个)工作者并创建该类型的实例?!
答案 0 :(得分:0)
你提供的信息很少,所以我猜测你真正想要的是什么。假设有一个抽象(纯虚拟)类
class worker { /* define some useful virtual interface */ };
并且您希望使用多个多态来使用多个不同的工作者。然后,您最好将它们保持在vector
unique_ptr
,以便在vector
范围的末尾,工作人员自动delete
d。您可以通过从用户提供的参数直接构造新工作程序来添加它。由于在定义farm
时甚至可能不知道新工作人员的类型,因此必须将此功能提供为template
。例如
class farm
{
std::vector<std::unique_ptr<worker>> workers; //
public:
// constructs new worker of type Worker with arguments provided
template<typename Worker, typename... Args>
void add_worker(Args&&...args)
{ workers.emplace_back(new Worker(std::forward<Args>(args)...)); }
};
并像这样使用
struct builder : public worker
{
builder(string const&, const widget*, some_type);
/* ... */
};
farm the_farm;
widget w( /* ... */ );
some_type x;
the_farm.add<builder>("the new builder", &w, x);
请注意,在调用farm::add()
时,只能提供第一个模板参数,其他模板参数将从函数参数中推断出来。
答案 1 :(得分:0)
在基类中创建纯虚拟克隆函数,并在每个派生类中重写它。
class ff_node
{
public:
virtual ff_node* clone() = 0;
};
class ff_child : public ff_node
{
public:
ff_node* clone() override {new ff_child;}
};
现在,给定ff_node* node
,您可以通过调用node->clone()
来创建相同运行时类型的另一个实例。