【问题标题】:Using class references to modify public members within another class使用类引用来修改另一个类中的公共成员
【发布时间】:2015-03-15 22:32:37
【问题描述】:

由于我的上一个问题中包含太多代码,因此我尝试以最简单的示例来说明我正在尝试做的事情。以这个为例,..

#include <iostream>
using namespace std;

class String
{
    public:
    private:
};

class ClassTwo
{
    public:
        int memberVariable;
    private:
};

class ClassOne
{
    public:
        ClassOne (ClassTwo&, String&);
        ~ClassOne();

    private:
        ClassTwo& classTwoReference;
        String& stringReference;
};

ClassOne::ClassOne (ClassTwo& two, String& string)
    : classTwoReference (two), stringReference (string)
{
    two.memberVariable = 3;
}

ClassOne::~ClassOne()
{
}

int main()
{
    String stringObject;
    ClassTwo classTwoObject;
    ClassOne classOneObject (classTwoObject, stringObject);
}

在 JUCE(我用来编写 VST 插件的 API)中,有一个字符串类,JUCE 将其命名为“String”。我不确定构造函数到底做了什么,但你可以使用类似的东西来创建一个 String 对象。

String newString("string");

在我的例子中,ClassTwo 是 AudioProcessor 类,它有一个公共成员变量,我可以像这样从 ClassOne 访问它。

two.memberVariable = 3;

就我而言,ClassOne 是我在 GUI 中使用的自定义组件(我将其命名为 PixelSlider)。它使用滑块侦听器来检查滑块的状态并修改 ClassTwo(AudioProcessor) 中的成员变量。我可以使用上面的方法很好地做到这一点,但问题是我想根据需要创建尽可能多的 ClassOne(PixelSlider) 对象。我想向他们传递一个 String 对象,告诉他们要修改 ClassTwo(AudioProcessor) 的哪个成员变量。从逻辑上讲,这可以通过传递对 String 对象的引用来完成,该对象的字符串值与 ClassTwo 成员变量的名称相同。像这样,...

ClassOne::ClassOne (ClassTwo& two, String& string)
        : classTwoReference (two), stringReference (string)
    {
        two.(string) = 3;
    }

这在 JUCE 中不起作用,但谁能告诉我一种方法来完成这项工作,而无需创建一堆几乎与修改不同 ClassTwo(AudioProcessor) 成员变量的 ClassOne(PixelSlider) 完全相同的不同类?

【问题讨论】:

  • “这显然在 JUCE 中不起作用” 这没有什么明显的。另请注意,您应该编辑和改进最后一个问题,而不是发布另一个问题。
  • 所以你说它应该可以工作?另外,我删除了我的最后一个问题。改进它会完全改变它,所以我只是发布了一个新的并删除它。
  • 我说对我来说没有什么明显的为什么不应该这样做。如果它对您不起作用,您应该详细说明究竟是什么不起作用。
  • @SteveyYarusinsky 您仍然错过了解释什么不起作用。
  • 有很多解决方案,这真的取决于整体情况。您的示例太简单/太小,无法清楚地看到您要做什么。发布的答案是其中之一,但并不总是正确的答案。

标签: c++ juce


【解决方案1】:

如果我理解正确,您正试图在运行时将 PixelSlider 目标绑定到 AudioProcessor 的成员,正如您所发现的,这不能按照您建议的方式完成 (two.(string) = 3 )。实现此绑定的一种方法是使用命令模式 (http://sourcemaking.com/design_patterns/command/cpp/2)。

AudioProcessor 可以为每个可修改属性公开这些命令对象的集合...

AudioProcessorCommand
AudioProcessor::GetCommandByName(String const& properyName) const
{
   ...
}

...您可以将其传递给PixelSlider 的构造函数。类似...

PixelSlider::PixelSlider(AudioProcessorCommand& command)
: command_{command}
{
  ...
}

PixelSlider 的值发生变化时,您将调用命令...

command_(this->value_);

【讨论】:

  • 这正是我想要的!先生,你太棒了。谢谢!
  • @gmbeard this.value_ 是错误的,应该完全省略 this-&gt;value_this
  • @πάνταῥεῖ 啊!我最近一直在写很多 C#。很好发现
猜你喜欢
  • 2013-03-25
  • 2011-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多