在C ++中是有办法传递一个类型(例如一个类)作为参数的函数?
解释为什么我需要这样的:有一个抽象data
类和manager
类。 该manager
类包含一个列表(或在这种情况下,地图)的派生类的对象的data
。 我使用unique_ptr
对于本作中的答复中提到了这个问题 。
class Data{}; // abstract
class Manager
{
map<string, unique_ptr<Data>> List;
};
现在想象一下,我想新添加data
存储经理。
class Position : public Data
{
int X;
int Y;
}
我怎么能告诉经理创建该类型的对象,是指一个unique_ptr
呢?
Manager manager;
manager.Add("position data", Position);
在这种情况下,我需要的类通过Position
的add
管理器类的功能,因为我不希望有先创建一个实例,然后将其发送给管理员。
然后,我怎么会在该类的对象添加到List
?
我不知道是否有这样做的在C ++中的一种方式。 如果不能轻松完成,我真的很想看到一个解决方法。 非常感谢!
您可以使用模板。 在每种类型的导出Data
,你将必须定义一个“创造者”的功能,它具有以下原型: Derived* create()
它将被称为内部(你也可以返回unique_ptr
,但是这将需要更多的内存)。
例如:
struct Position: public Data
{
// ...
static Position* create()
{
return new Position();
}
};
该Add
方法是:
template<typename D>
void Add(String str)
{
List.insert(std::make_pair(str, std::unique_ptr<Data>(D::create())));
}
然后你使用这样的:
Manager manager;
manager.Add<Position>("position data");
编辑
您也可以摆脱的create
功能,通过使用这种Add
方法:
template<typename D>
void Add(String str)
{
List.insert(std::make_pair(str, std::unique_ptr<Data>(new D())));
}
优点:在数据结构的代码更少的代码。
难以忽视的:数据结构对他们是如何建立的控制较少。
什么是这样的:
class Manager
{
public:
template <typename T>
void addData(const std::string& title)
{
List.insert(std::make_pair(title, std::unique_ptr<Data>(new T));
}
private:
map<string, unique_ptr<Data>> List;
};
然后
Manager manager;
manager.addData<Position>("position data");
使用unique_ptr
意味着接受与动态分配对象的工作。 (并不完全正确:你可以提供一个定制删除不调用delete
,但成为类型的一部分,这意味着你会犯与非 -dynamically分配对象的工作)
void Manager::Add(String title, unique_ptr<Data> d) {
List[title] = d;
}
称呼其为:
Manager manager;
unique_ptr<Data> pos(new Position);
// Set it up
manager.Add("position data", pos);
注意:如果你希望能够与您的数据对象做任何事情,你可能要声明内至少一个虚拟函数的class Data
。
定义功能如下:
void Manager::Add(String title,Position pos){ /*snip*/ }
然后你可以使用的功能如下:
Manager manager;
Position posData;
//setup the posData
manager.Add("position data",posData);