看起来C++似乎没有办法做到这一点,但我希望我错了.
我想要做的是在头文件中创建一个映射(在这种情况下将一组字符串映射到另一组,而不是数据类型应该真正重要),以便多个源文件可以直接访问该映射.
现在我只是在我的头文件中定义了一个函数,并在源文件中实现了本质上完成这个功能,但我更喜欢使用地图,因为我可以一眼看出键/值是什么是.
我遇到的问题是填充地图需要可执行代码,我不能将其放入头文件中.有没有什么好方法可以实现我想做的事情?
有几种方法可以做到这一点.
您可以在头文件中声明变量,但需要在cpp文件中定义它...
// FOO.H STARTS HERE
#include <map>
#include <string>
extern std::map<std::string, std::string> my_map;
// FOO.H ENDS
// FOO.CPP STARTS HERE
#include <iostream>
#include "foo.h"
std::map<std::string, std::string> my_map = {
{ "Cat", "Feline" },
{ "Dog", "Canine" },
{ "Fish", "Fish" }
};
int main (void) {
for (auto i = my_map.begin(); i != my_map.end(); ++i) {
std::cout << "A " << i->first << " is a " << i->second << std::endl;
}
return 0;
}
// FOO.CPP ENDS HERE
Run Code Online (Sandbox Code Playgroud)
或者,您可以将地图保留在标题中,只要它是常量. 这有一个缺点,它显然只有你不需要改变地图才有效.
// FOO.H STARTS HERE
#include <map>
#include <string>
const std::map<std::string, std::string> my_map = {
{ "Cat", "Feline" },
{ "Dog", "Canine" },
{ "Fish", "Fish" }
};
// FOO.H ENDS HERE
// FOO.CPP STARTS HERE
#include <iostream>
#include "foo.h"
int main (void) {
for (auto i = my_map.begin(); i != my_map.end(); ++i) {
std::cout << "A " << i->first << " is a " << i->second << std::endl;
}
return 0;
}
// FOO.CPP ENDS HERE
Run Code Online (Sandbox Code Playgroud)
这两个示例都假设使用C++ 11,以便使用漂亮而漂亮的map = { }初始化程序.
这是不使用 C++11 的解决方案。此示例还使用三个文件只是为了“证明”它的工作原理。
如果不打算更改映射,则应将初始化从 foo.cpp 移至 foo.h 并设为 const。
// FOO.H STARTS HERE
#include <map>
#include <string>
#include <vector>
typedef std::pair<std::string, std::string> stringpair_t;
const stringpair_t map_start_values[] = {
stringpair_t("Cat", "Feline"),
stringpair_t("Dog", "Canine"),
stringpair_t("Fish", "Fish")
};
const int map_start_values_size = sizeof(map_start_values) / sizeof(map_start_values[0]);
extern std::map <std::string, std::string> my_map;
// FOO.H ENDS HERE
Run Code Online (Sandbox Code Playgroud)
// FOO.CPP STARTS HERE
#include <iostream>
#include "foo.h"
std::map<std::string, std::string> my_map (map_start_values, map_start_values + map_start_values_size);
int main2(void);
int main (void) {
for (std::map<std::string, std::string>::const_iterator i = my_map.begin(); i != my_map.end(); ++i) {
std::cout << "A " << i->first << " is a " << i->second << std::endl;
}
main2();
return 0;
}
// FOO.CPP ENDS HERE
Run Code Online (Sandbox Code Playgroud)
// FOO2.CPP STARTS HERE
#include "foo.h"
#include <iostream>
int main2 (void) {
for (std::map<std::string, std::string>::const_iterator i = my_map.begin(); i != my_map.end(); ++i) {
std::cout << "A " << i->first << " is a " << i->second << std::endl;
}
return 0;
}
// FOO2.CPP ENDS HERE
Run Code Online (Sandbox Code Playgroud)