header1.h
#define MaxNum 10
#define MinNum 1
//similar 100 other variables defined
main.cpp
#include header1.h
main()
{
int size;
string first = "MaxNum"; //could be any of the variable name defined in header file
size = MaxNum ;
我在头文件中定义了某些变量。 主要是,取决于"第一"的价值。我需要设置" size"的值。这可以吗?
答案 0 :(得分:3)
我想你想拥有
size = MaxNum
如果first == "MaxNum"
和
size = MinNum
如果first == "MinNum"
。如果first
(可供选择的变量集)的可能值集合很小,您可以简单地将赋值放在if
,else if
系列语句周围。最后,输入else
语句来编写错误消息。
但是,每个案例都必须硬编码:
if (first == "MaxNum") {
size = MaxNum;
}
else if (first == "MinNum") {
size = MinNum;
}
//...
因此,随着变量数量的增加,决定size
赋值的代码会变大。这被认为是糟糕的风格,非常不可维护以及容易出错。
如果您不想这样做,在程序中不要使用多个变量,而是包含所有这些可能键及其值的容器变量。它被称为关联容器,在C ++中有一个类型std::map
来实现这样的数据结构。
// Your container for the sizes (or whatever you want to call it)
std::map<std::string, int> sizes;
sizes["MinNum"] = 1;
sizes["MaxNum"] = 100;
// ... more values ...
// Accessing this container with a variable as the key:
size = sizes[first];
如您所见,使用字符串变量作为键访问此容器非常简单。 sizes[first]
只是为您提供容器中的值,其中键等于变量first
的当前内容的值。
关于C ++(和C)源代码的一个非常重要的事实是,在运行时,您无法访问变量的名称。基本上,它们可以在不影响程序的情况下重命名。当您编写代码时,您想要拥有的内容(查询变量名称,枚举,类,函数及其参数等)称为 introspection 或元编程它对你的代码进行操作(“元代码”)。
C ++不提供每个默认的元编程工具(只有我知道的例外:typeid
,但没有任何变量名/定义)。默认情况下,您可以解决此限制,并在构建过程中包含一些额外步骤,这些步骤将解析这些定义的头文件,并以在运行时可访问的其他方式存储它们。但相信我,地图是更好的方式。