1

由于我的最后一个问题中包含太多代码,因此我尝试制作最简单的示例来说明我正在尝试做的事情。举个例子,..

#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 中不起作用,但是任何人都可以告诉我一种方法来完成这项工作,而不必创建一堆几乎与 ClassOne(PixelSlider) 一样修改不同 ClassTwo(AudioProcessor) 成员变量的不同类?

4

1 回答 1

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_);
于 2015-01-17T11:47:00.313 回答