我正在Visual Studio 2012中构建一个表单,我有一个名为trFinger1Ph1
的控制器(一个更具体的滑块)。是否可以使用变量来访问它?
这就是我通常访问我的控件(有效)的方法
int value = Form1::trFinger1Ph1-> Value;
但我希望这样做:
std::string test = "trFinger1Ph1"
int value = Form1::test -> Value;
我正在使用它,因为我有一个很大的控件列表,以这种方式访问它们将帮助我清理我的大部分代码。 很明显,该程序正在查看trFinger1Ph1内部进行测试,而不是将其识别为变量测试。
有什么想法吗?
答案 0 :(得分:2)
不,你不能这样做。您可以使用PHP和其他一些语言,但在C或C ++中不可能(这也适用于许多其他语言)
编译代码时,变量的名称将“消失”。
你可以做其他事情来解决问题(因为我怀疑这是一个XY问题 - 你问的是如何做Y因为你有问题X,你认为做Y是解决问题的正确方法)。例如,您可以拥有一个包含名称作为字符串的表,以及对该引用的相关对象的引用,然后使用该表来查找该字符串,并使用该引用来获取该值。我不是“形式”的专家但是......
答案 1 :(得分:2)
Mats Petersson和Captain Oblivious在答案中都是正确的,你不能这样做。在C ++中,没有办法通过包含其名称的字符串来访问变量或对象。
但是, 是WinForms中一种访问表单控件的方法,如果你拥有的是一个包含其名称的字符串。您可以使用父表单维护的Controls
collection来执行此操作。
您可以使用for each
循环手动迭代此集合,将每个控件的Name
属性值与字符串对象进行比较,直到获得匹配为止:
for each (Control ^ctl in this->Controls)
{
if (ctl->Name == "trFinger1Ph1")
{
// Found a match!
// ...
}
}
...或者您可以使用Find
method让框架搜索您并返回包含所有可能匹配项的数组。
var ctrls = this.Controls.Find("trFinger1Ph1", true);
不幸的是,你不能使用你提出的语法来做到这一点。那就是:
std::string test = "trFinger1Ph1"
int value = Form1::test -> Value; // won't work!
显然,您需要确保所有控件都具有唯一名称才能使其正常工作。它有点design smell,看起来非常可疑,可能是错误的。我不建议将此作为一种“清理”代码的一般方法,就像你在问题中建议的那样。
答案 2 :(得分:1)
您无法在C ++中以这种方式访问变量。
如果确实希望通过字符串文字访问它们,您可以创建一个std::map
并使用指针或对各种成员变量的引用填充它。
std::map<std::string, ControlType&> controls;
controls.insert(std::pair<std::string, ControlType&>("xyz", Form::trFinger1Ph1);
controls["xyz"].Value = somevalue;
我认为这不会让你的代码变得更干净。另一种方法是简单地声明对控件的引用。
ControlType& control1 = Form::trFinger1Ph1;
control1.Value = somevalue;