我有一个创建对象的类,并使用整数键将它们存储到地图中 因此,如果用户正在创建新对象,则默认第一密钥是100,然后如果用户决定进行更多,则它增加1(即101,102等)。我该如何自动化这个过程?
例如,假设该类正在创建包含教室名称的字符串对象的向量。
std::map<int, vector<string>> classrooms;
因此,当用户第一次创建实例时,第一个将通过整数键100访问,但是如果用户想要添加更多,那么我将如何使其增加1。 (假设int main在while循环中运行,允许交互式命令继续创建更多的教室)
答案 0 :(得分:1)
你说你想存储对象并将它们存储在地图中,但是你的例子有一个字符串向量的地图,所以为了保持这个例子你可以编写一个容器来管理教室和地图的创建:
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
。
答案 1 :(得分:1)
您可以拥有一个带有重载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;
}