我有一个可以创建对象的类,并将它们存储在用整数密钥的地图中因此,如果用户创建一个新对象,则默认的第一个密钥为100,然后用户决定制作更多,则它会增加1(即101、102等(。我将如何自动化此过程?
例如,假设类正在创建包含教室名称的字符串对象的向量。
std::map<int, vector<string>> classrooms;
因此,当用户创建一个实例时,第一个将由整数密钥100访问,但是如果用户想添加更多信息,我将如何使其增加1。(假设int main在段循环中运行,允许交互式命令继续创建更多的教室(
您可以拥有一个带有过载operator ()
的键发电机类,以通过每个调用来生成键的增量唯一键,例如:
#include <map>
class keyGen
{
public:
keyGen(int x): key(x) {}
int operator()(int x = 1) {
return (key += x);
}
private:
int key;
};
class someClass
{
private:
std::map<int, std::string> dataMap;
keyGen kg;
public:
someClass(): kg(0) {};
void createFoo(std::string foo)
{
dataMap.insert(std::pair<int, std::string>(kg(), foo));
}
void createBar(std::string bar)
{
dataMap.insert(std::pair<int, std::string>(kg(), bar));
}
};
int main()
{
someClass sc;
sc.createFoo("foo"); //sc::dataMap == [1, "foo"]
sc.createBar("bar"); //sc::dataMap == [2, "bar"]
return 0;
}
您说您要存储对象并将它们存储在地图中,但是您的示例具有字符串向量的映射,因此要使用该示例,您可以编写一个容器教室和地图:
struct classroom_collection {
typedef std::vector<std::string>> classroom_type;
classroom_type& create_classroom();
//... more ... eg get_class_room(size_t index);
private:
std::map<size_t,classroom_t> classrooms;
};
create_classroom
将创建classroom
,将其添加到地图中,然后返回对其的引用。更通用的情况看起来像这样:
template <typename T>
struct X_collection {
X& create_X();
private:
std::map<size_t,X> data;
};
,如果classroom
是您的自定义类(不仅是字符串的向量(,它应该具有私人构造函数并成为该集合的朋友,以便创建classroom
的唯一方法是通过classroom_collection
。