gpt4 book ai didi

c++ - 如何将类作为参数传递

转载 作者:太空狗 更新时间:2023-10-29 23:46:12 25 4
gpt4 key购买 nike

在 C++ 中有没有办法将类型(例如类)作为参数传递给函数?

解释为什么我需要这个:有一个抽象的 data 类和一个 manager 类。 manager 类包含 data 的派生类的对象列表(或在本例中为映射)。正如 this question 的回答中提到的,我为此使用 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 派生的每个类型中,您必须定义一个“创建者”函数,它具有以下原型(prototype):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");

编辑

您还可以通过使用此 Add 方法摆脱 create 函数:

template<typename D>
void Add(String str)
{
List.insert(std::make_pair(str, std::unique_ptr<Data>(new D())));
}

优点:数据结构代码少。

不方便:数据结构对其构建方式的控制较少。

关于c++ - 如何将类作为参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13109356/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com