根据其他变量设置变量

时间:2013-04-10 19:32:30

标签: c++

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"的值。这可以吗?

1 个答案:

答案 0 :(得分:3)

我想你想拥有

size = MaxNum

如果first == "MaxNum"

size = MinNum

如果first == "MinNum"。如果first(可供选择的变量集)的可能值集合很小,您可以简单地将赋值放在ifelse 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,但没有任何变量名/定义)。默认情况下,您可以解决此限制,并在构建过程中包含一些额外步骤,这些步骤将解析这些定义的头文件,并以在运行时可访问的其他方式存储它们。但相信我,地图是更好的方式。