Создание класса, который наследуется от другого класса? - PullRequest
0 голосов
/ 24 ноября 2018

Я пытаюсь выучить 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, а затем начал выводить его.

Как мне это сделать или исправить?Спасибо.

Ответы [ 2 ]

0 голосов
/ 24 ноября 2018

Единственным различием является параметр функции getOutput. Он передается по значению

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

Таким образом, член частота изменится при вызове функции getOutput. Член частота используется в другом месте?вы можете проверить значение при отладке.

0 голосов
/ 24 ноября 2018

Я считаю, что происходит то, что вы оба наследуете и имеете член class MaxiOSc.При наследовании класса все члены parent теперь являются членами дочернего класса.Включая объект родительского класса, эти члены дублируются.

В вашей функции double getOutput(double frequency) в ModalUnit вы выводите, используя объект-член типа MaxiOsc.Между тем, при вызове методов, унаследованных от MaxiOsc до ModalUnit, используются унаследованные члены.

...