【问题标题】:How to I pass a checkbox value by reference with CLI?如何通过 CLI 引用传递复选框值?
【发布时间】:2010-11-07 21:34:36
【问题描述】:

我有一个用 C++/CLI 编写的 GUI 应用程序,它有很多可配置的选项。我有一些从我的数据源中获取值的重载函数,我想将我的选项连接到这些值。

这里有几个数据检索器:

bool GetConfigSingle(long paramToGet, String^% str, char* debug, long debugLength);
bool GetConfigSingle(long paramToGet, bool^% v_value, char* debug, long debugLength);

我希望传递复选框的Checked getter/setter 如下:

result = m_dataSource->GetConfigSingle(CONFIG_OPTION1, this->myOption->Checked, debug, debugLen);

...但由于某种原因,我收到了一个奇怪的编译器错误,这表明 Checked 值没有像我预期的那样被传递:

1>.\DataInterface.cpp(825) : error C2664: 'bool DataInterface::GetConfigSingle(long,System::String ^%, char*, long)' : cannot convert parameter 2 from 'bool' to 'System::String ^%'

之前这段代码传入了复选框并修改了值本身,但我很想打破我们的数据收集当前对 Windows 窗体的依赖。

那么我在这里错过了什么?

[编辑]为了避免混淆,我已经按照原来的方式填写了函数定义 - 我试图减少不相关信息的尝试失败了。

我相当肯定the CheckBox getter / setter returns a bool

【问题讨论】:

  • 嗯,你为什么要首先通过引用传递布尔值?重点是什么?考虑到 Checked 是一个属性,您没有获得对实际数据成员的引用,因此无论如何您都无法更改它。
  • 重点是我想设置一个复选框来表示一个代码/麻烦最少的值。如果您能找到实现这一目标的更好方法,请发表您的想法 - 我很想看到您的建议。
  • 也许我今天速度很慢,但我不明白你在做什么。如果您想知道 GetConfigSingle 中复选框的状态,只需传递其值即可。如果要根据GetConfigSingle的结果进行设置,将返回值赋值给Checked。如果您尝试从 GetConfigSingle 内部更改它,则必须将实际复选框作为参数传递并在 GetConfigSingle 中使用它。传递引用会将 ref 传递给 Checked getter 返回的临时对象。
  • Tal Pressman:他想要实现的是复选框是某个布尔变量内容的视觉指示。不幸的是,这并不容易,因为即使您更改了基础值,复选框仍然不会自动重绘,也就是说,您不会在屏幕上看到更改。你必须在这里实现某种观察者模式来实现你想要的。
  • @Tal: "如果你想根据GetConfigSingle的结果来设置,把返回值赋给Checked"——就是这样,但是返回值表示函数是否成功所以我必须传入值作为参考。

标签: c++-cli reference pass-by-reference


【解决方案1】:

这不是我的问题的答案,但值得注意 - 显然有 a quirk in passing properties by reference

【讨论】:

    【解决方案2】:

    我想我会从上面澄清我的 cmets 并使其成为“真实”的答案......

    当您调用 Checked 时,您得到的返回值是一个表示 CheckBox 当前状态的布尔值。但是,不是,它是对保存 CheckBox 状态的实际数据成员的引用。事实上,一个正确封装的类不应该提供对它的访问权限。此外,由于 Checked 按值返回 bool,因此该 bool 是一个临时对象,在调用 GetCongigSingle 时不一定存在。

    这为您提供了多种选择。要么通过值传递 bool,然后设置 CheckBox 的状态,要么通过引用传递 CheckBox 本身,然后在任何你想要的地方“检查”它。

    【讨论】:

    • 这与我得出的结论相同。使用 poperty 本来是一种非常干净的做事方式,但由于它没有公开可变引用,所以我编写了一个接口,它允许 GetConfig 函数修改一个值,然后可以设置复选框。
    【解决方案3】:

    您提到的方法GetConfigSingleFile 的两个重载都带有两个参数,而您将4 个参数传递给该方法。是否有任何默认参数?如果是,能否请您重现原始方法声明?

    很可能,此方法的 4 参数重载期望 String^% 作为第二个参数。无论如何,这就是编译器的建议。但是,如果我们可以查看有助于诊断问题的方法声明。

    【讨论】:

    • 哎呀,这对我来说是一些糟糕的发布编辑 - 请稍后查看我修改后的答案。
    • 对,进行了更正 - 没有默认参数,完整的源代码在每个方法上都有一些额外的,所以这不是问题。我认为这与复选框的获取和设置没有正确传递这一事实有关?
    • 然后确保'Checked'属性的getter返回一个布尔值。此外,尝试将其显式转换为 (bool) 以查看它是否有效。顺便说一句,我还是不明白你怎么能用 4 个参数调用一个 2 个参数的方法?
    • 尝试投射它仍然没有帮助。
    • 好的,再试一次,如果你已经复制粘贴了,那么在你进行函数调用的地方,在第二个参数之后,有一个'。'代替 ','。是这个问题吗?
    猜你喜欢
    • 2015-04-06
    • 2016-12-31
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 2012-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多