使用 class 引用修改另一个 class 中的 public 成员

Using class references to modify public members within another class

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

#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);
}

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

String newString("string");

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

two.memberVariable = 3;

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

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

这在 JUCE 中不起作用,但是任何人都可以告诉我一种方法来完成这项工作而不必创建一堆不同的 classes 几乎完全像 ClassOne(PixelSlider) 修改不同的 ClassTwo( AudioProcessor)成员变量?

如果我理解正确,您正试图在运行时将 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_);