如何通过一类作为参数(How to pass a Class as Parameter)

2019-08-02 01:30发布

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

在这种情况下,我需要的类通过Positionadd管理器类的功能,因为我不希望有先创建一个实例,然后将其发送给管理员。

然后,我怎么会在该类的对象添加到List

我不知道是否有这样做的在C ++中的一种方式。 如果不能轻松完成,我真的很想看到一个解决方法。 非常感谢!

Answer 1:

您可以使用模板。 在每种类型的导出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())));
}

优点:在数据结构的代码更少的代码。

难以忽视的:数据结构对他们是如何建立的控制较少。



Answer 2:

什么是这样的:

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


Answer 3:

使用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



Answer 4:

定义功能如下:

void Manager::Add(String title,Position pos){ /*snip*/ }

然后你可以使用的功能如下:

Manager manager;
Position posData;
//setup the posData
manager.Add("position data",posData);


文章来源: How to pass a Class as Parameter