c++ - 根据其他变量设置变量

标签 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 ; 

我在头文件中定义了某些变量。 主要是,根据“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/

相关文章:

c++ - 使用 Allegro/SDL 与 OpenGL/DirectX 制作游戏会遇到哪些限制?

c++ - 在macOS Homebrew上安装CGAL

c++ - 重新定义格式参数错误

c++ - 在非透明父窗口之上创建透明子窗口 (win32)

c++ - 为游戏开发编写 map 编辑器

c++ - 如何朝相机的方向移动,OpenGL,c++

c++ - 无需显式初始化父类的虚拟继承

c++ - 如何使用 iOS 中 OpenCV 框架的自定义路径在 CMake 中查找包

c++ - 这种设计模式的名称是什么?门面、适配器、网桥、代理?

c++ - 初学者有什么实际使用的好项目