C++中如何把一个变量的值作为另一个变量的名?

刚开始自学的c++,IDE为Qt,版本为5.4.2…别说我蠢… ——— 8-11修改: 不知道我这样理解的需求对不对,我最近也碰到了差不多的变态需求如…
关注者
119
被浏览
89,591

32 个回答

这其实是一个好问题。Perl语言入门那本书里提到:当你问到这个问题的时候,说明你有了一些进步;而当你明白为什么通常都不需要这个特性的时候,说明你又有了一些进步。

如果你想在运行时把一个变量的字符串内容当做另一个变量的名字,说明语言真的在运行时是通过字符串的名字来访问变量的。而C、C++、Fortran、Rust之类的高性能语言都不这么做,因为这相当于运行时进行查找,非常耗计算力。他们在编译时就把变量转换成了“固定”的地址调用,运行时并不存在变量名这个东西。

即使对于能够这么做的语言,也通常不鼓励你这么做。这是因为变量名是程序的一部分,这么做相当于在用数据去修改程序,不但非常容易混乱,而且在大程序里这是潜在的安全性问题。

实际上你需要的是另一种东西:键值对的查找表,键是字符串,值是你需要的东西。在C++里,你可以简单地用标准库的std::map或者std::unordered_map。

==========

补充:允许你这么做的语言,通常都:

  • 很古老;
  • 缺乏变量引用的能力,必须这么做;
  • 自己放弃治疗,不打算用来构建大型程序。

我知道的有shell脚本、CMake、Perl。这里面,shell很古老;CMake是构建脚本,不是通用语言;Perl并不鼓励你这么做,use strict之后也不允许你这么做。

================

继续补充:

现在很多语言通过在解释器里增加优化步骤、中间代码编译到native code一类的技术,可以极大地改善运行效率。

不过即使如此,你原本就需要付出的代价是不能被减少的。比如这个题目里提到的运行时符号查找,即使你用C++做,也依然不能免除一次字符串hash查找。

===================

对于题目增加内容的补充:

多层不定连接的问题,显然需要使用图来解决。首先自己定义好节点对象和边对象,然后也许需要一些全局的单步关系映射表(比如简单的谁的父是谁、谁的子是谁)。剩下的事情,基本就是一些图论的算法问题。

反正无论如何,你也不应当使用动态产生变量来搞这种事,实际上仅仅这样也搞不定这种事。

如果你不需要在后台解决这个问题,可以接受交互程序,那你可以使用cytoscape。这个软件可以从两两关系的列表生成网络,带有一些分析和排版功能,常用于生物学代谢调控网络的可视化和分析。

既然用的Qt,你可知道

QObject obj;obj.setProperty("name", "hello world");

QJsonObject obj;obj["name"]="hello world"

QMap<QString, QString> map

.....

里面的name都可以换成运行时变量的值。

个人比较倾向用QJson*,因为常用的数据结构都能用json来描述,配上QVariant简直太好用了。