由于我的上一个问题中包含太多代码,我试图用最简单的例子来说明我要做的事情。以此为例,......
#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命名&#34;字符串&#34;。我不确定构造函数究竟做了什么,但你可以使用类似的东西来创建一个String对象。
String newString("string");
在我的情况下,ClassTwo是AudioProcessor类,它有一个公共成员变量,我可以像这样从ClassOne访问。
two.memberVariable = 3;
在我的案例中,ClassOne是我在GUI中使用的自定义组件(我将其命名为PixelSlider)。它使用滑块侦听器来检查滑块的状态,并在ClassTwo(AudioProcessor)中修改成员变量。我可以使用上面的方法做到这一点,但问题是我想创建尽可能多的ClassOne(PixelSlider)对象。我想传递一个String对象,告诉他们要修改的ClassTwo(AudioProcessor)成员变量。逻辑上,这可以通过传递对String对象的引用来完成,该String对象具有与ClassTwo成员变量的名称相同的字符串值。像这样......,
ClassOne::ClassOne (ClassTwo& two, String& string)
: classTwoReference (two), stringReference (string)
{
two.(string) = 3;
}
这在JUCE中不起作用,但是有人能告诉我一种方法来完成这项工作而不必创建一堆几乎完全像ClassOne(PixelSlider)修改不同ClassTwo(AudioProcessor)成员变量的不同类吗?
答案 0 :(得分: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_);