Stevey Yarusinsky
Stevey Yarusinsky

Reputation: 13

Using class references to modify public members within another class

Since my last question had too much code in it, I tried to make the simplest example of what I'm trying to do. Take this for example,..

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

In JUCE, which is the API I'm using to code a VST Plugin, there is a string class that JUCE names "String". I'm not sure exactly what the constructor does, but you can use something like this to create a String object.

String newString("string");

The ClassTwo in my case, is the AudioProcessor class which has a public member variable that I can access from ClassOne like this.

two.memberVariable = 3;

The ClassOne in my case, is a custom Component(I named it PixelSlider) that I'm using in my GUI. It uses a slider listener to check the status of a slider and modify the member variable in ClassTwo(AudioProcessor). I can do this fine using the method above, but the issue is that I want to create as many ClassOne(PixelSlider) objects as I need. I want to pass them a String object that tells them what member variable of ClassTwo(AudioProcessor) to modify. Logically, this would be done by passing a reference to a String object with the same string value as the name of the ClassTwo member variable. Like this,...

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

This doesn't work in JUCE, but can anybody tell me a way to get this done without having to create a bunch of different classes almost exactly like ClassOne(PixelSlider) that modify different ClassTwo(AudioProcessor) member variables?

Upvotes: 1

Views: 127

Answers (1)

gmbeard
gmbeard

Reputation: 704

If I understand correctly, you're trying to bind a PixelSlider target to a member of AudioProcessor at runtime, which, as you've discovered, can't be done the way you suggest ( two.(string) = 3 ). One way of achieving this binding would be to use the command pattern (http://sourcemaking.com/design_patterns/command/cpp/2).

AudioProcessor could expose a collection of these command objects for each modifiable property ...

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

... which you can pass to the constructor of PixelSlider. Something along the lines of ...

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

When the PixelSlider's value changes you would invoke the command ...

command_(this->value_);

Upvotes: 1

Related Questions