1

我正在 Visual Studio 2012 中构建一个表单,并且我有一个名为trFinger1Ph1. 是否可以使用变量访问它?

这就是我通常访问我的控件的方式(有效)

int value = Form1::trFinger1Ph1-> Value;

但我希望这样做:

std::string test = "trFinger1Ph1"
int value = Form1::test -> Value;

我之所以使用它是因为我有大量控件,并且以这种方式访问​​它们将帮助我清理大部分代码。很明显,该程序正在寻找 trFinger1Ph1 内部进行测试,而不是将其识别为变量测试。

有任何想法吗?

4

3 回答 3

2

不,你不能那样做。您可以使用 PHP 和其他一些语言,但不能使用 C 或 C++(这也适用于许多其他语言)

编译代码时,变量的名称将“消失”。

您也许可以做其他事情来解决问题(因为我怀疑这是一个 XY 问题 - 您问如何做 Y,因为您有问题 X,并且您认为做 Y 是解决它的正确方法)。例如,您可以有一个包含名称作为字符串的表,以及对 this 所引用的相关对象的引用,然后使用该表查找字符串,并使用该引用获取值。但是,我不是“表格”方面的专家...

于 2013-06-28T23:06:28.843 回答
2

Mats Petersson 和 Captain Oblivious 的答案都是正确的,你不能这样做。在 C++ 中,无法通过包含变量或对象名称的字符串来访问变量或对象。

但是,如果您所拥有的只是一个包含其名称的字符串,则 WinForms 中有一种方法可以访问表单上的控件您可以使用由父表单维护的Controls集合来执行此操作。

您可以使用循环手动迭代此集合for each,将Name每个控件的属性值与您的字符串对象进行比较,直到获得匹配项:

for each (Control ^ctl in this->Controls)
{
    if (ctl->Name == "trFinger1Ph1")
    {
        // Found a match!
        // ...
    }
}

…或者您可以使用该Find方法让框架为您进行搜索并返回一个包含所有可能匹配项的数组。

var ctrls = this.Controls.Find("trFinger1Ph1", true);

不幸的是,您不能使用您建议的语法来做到这一点。那是:

std::string test = "trFinger1Ph1"
int value = Form1::test -> Value;  // won't work!

显然,您需要确保所有控件都具有唯一的名称才能使其正常工作。这是一种设计气味,看起来非常可疑,可能是错误的。我不建议将此作为“清理”代码的一般方法,就像您在问题中建议的那样。

于 2013-06-28T23:37:18.337 回答
1

您不能在 C++ 中以这种方式访问​​变量。

如果您真的想通过字符串文字访问它们,您可以创建 astd::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;
于 2013-06-28T23:13:52.850 回答