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 ;
我在头文件中定义了某些变量。 主要是,根据“first”的值,我需要设置“size”的值。这可行吗?
最佳答案
我猜你想拥有
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++ 默认不提供元编程功能(我知道的唯一异常(exception):typeid
,但没有变量名/定义)。默认情况下,您可以绕过此限制并在构建过程中包含一些额外的步骤,这些步骤会解析您的头文件以获取这些定义并以在运行时可访问的不同方式存储它们。但 map 是更好的方式,相信我。
关于c++ - 根据其他变量设置变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15934767/