创建一个从另一个类继承的类?

时间:2018-11-24 04:54:11

标签: c++ inheritance juce

我正在尝试从Juce学习C ++并构建音频合成器。

我有一个合成器,可以像这样简短地输出来自振荡器类(MaxiOsc)的音频:

class SynthVoice : public SynthesiserVoice
{

private:

    MaxiOsc testOsc;
    double frequency = 0; // frequency is then changed by another function by new notes from the keyboard of course ...

public:

    double oscOutput()
    {
        return testOsc.sinewave(frequency);
    }

void renderNextBlock (AudioBuffer <float> &outputBuffer, int startSample, int numSamples) override
    {
        for (int sample = 0; sample < numSamples; ++sample)
        {

            for (int channel = 0; channel < outputBuffer.getNumChannels(); ++channel)
            {
                outputBuffer.addSample(channel, startSample, oscOutput() //MAIN OUTPUT HERE
            }
            ++startSample;
        }

    }

我正在尝试创建一个名为ModalUnit的新类,该类继承自MaxiOsc并在其中创建一个MaxiOsc对象。这个想法是在上面的合成器代码中使用ModalUnit代替MaxiOsc,并最终在ModalUnit类代码中添加额外的处理。

这是ModalUnit类的内容:

class ModalUnit    : public MaxiOsc
{
public:
    ModalUnit()
    {

    }

    double getOutput(double frequency)
    {
        output = testOsc.sinewave(frequency);
        return output;
    }


private:
    MaxiOsc testOsc;
    double output = 0.0;

};

但是当我尝试在合成器代码中实现此功能时,它不会输出任何音频:

class SynthVoice : public SynthesiserVoice
{

private:

    ModalUnit testModalUnit;
    double frequency = 0; // frequency is then changed by another function by new notes from the keyboard of course ...

public:

    double modalUnitOutput()
    {
        return testModalUnit.getOutput(frequency);
    }

void renderNextBlock (AudioBuffer <float> &outputBuffer, int startSample, int numSamples) override
    {
        for (int sample = 0; sample < numSamples; ++sample)
        {

            for (int channel = 0; channel < outputBuffer.getNumChannels(); ++channel)
            {
                outputBuffer.addSample(channel, startSample, modalUnitOutput() //MAIN OUTPUT HERE
            }
            ++startSample;
        }

    }

在创建新类时,我做错了什么?我基本上只希望ModalUnit类在其中创建MaxiOsc,然后从该类开始输出。

我该怎么做或解决此问题?谢谢。

3 个答案:

答案 0 :(得分:0)

我相信正在发生的事情是您既在继承又拥有class MaxiOSc的成员。继承类时,父级的所有成员现在都是子级的成员。通过包含父类的对象,可以复制这些成员。

double getOutput(double frequency)的{​​{1}}函数中,您使用类型ModalUnit的成员对象进行输出。同时,当调用从MaxiOsc继承到MaxiOsc的方法时,将使用继承的成员。

答案 1 :(得分:0)

唯一的区别是函数getOutput的参数。它通过值传递

double getOutput(double frequency)
{
    output = testOsc.sinewave(frequency);
    return output;
}

因此调用getOutput函数时成员 frequency 会发生变化。成员 frequency 是否在其他地方使用?您可以在调试时检查该值。

答案 2 :(得分:0)

也许尝试从ModelUnit中删除注入的MaxiOsc,然后继续继承即可。在ModelUnit中,重写要在其中进行额外处理的MaxiOsc中的函数,然后从您的函数版本内部调用基类的实现。