0
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”的值。这是可行的吗?

4

1 回答 1

3

我猜你想拥有

size = MaxNum

如果first == "MaxNum"

size = MinNum

如果first == "MinNum". 如果(可供选择的变量集)的可能值集很小,first您可以简单地将赋值放在一系列语句周围。最后,放一条语句,写一条错误信息。ifelse ifelse

但是,您必须对每种情况进行硬编码:

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)源代码的一个非常重要的事实是,在运行时您无法访问变量的名称。所以本质上,它们可以被重命名而不会影响你的程序。当您编写对您的代码(“元代码”)进行操作的代码时,您想要拥有的(查询变量、枚举、类、函数、它们的参数等的名称)被称为自省元编程。

默认情况下,C++ 不提供元编程工具(我知道的唯一例外:typeid,但变量名/定义没有)。默认情况下,您可以绕过此限制并在构建过程中包含一些额外的步骤,该步骤会解析这些定义的头文件并以在运行时可访问的不同方式存储它们。但地图是更好的方式,相信我。

于 2013-04-10T19:38:48.430 回答