引用具有多个声明的另一个类

时间:2015-12-21 15:11:55

标签: c++

我正在创建一个音频应用程序,它有4个looper轨道和一个带播放按钮的传输栏。我想点击播放按钮同时播放所有4个弯曲。

在我的TranportBarGui类中,在.h文件中,我已经看到了对Looper实例的引用,如你所见:

class TransportBarGui : public Component,
                    public Button::Listener,
                    public Timer

{
public:

    TransportBarGui(Looper& looperRef_);

    ~TransportBarGui();
private:
    TextButton playButton;
    Looper& looperRef; //reference to looper

并且在TransportBarGui.cpp文件中,当按下按钮时,使用looper引用播放looper:

void TransportBarGui::buttonClicked (Button* button)
{
    if (button == &playButton)
    {
        if (looperRef.getPlayState() == 0)
        {

            looperRef.setPlayState(!looperRef.getPlayState()); //turn on looper
            playButton.setButtonText("Stop");
            playButton.setToggleState(looperRef.getPlayState(), dontSendNotification);
            DBG(looperRef.getPlayState());
        }
    }
}

我遇到的问题是我已经在audio.h文件中声明了4个Loopers(这是进行音频处理的类),你可以在这里看到:

private:
    AudioDeviceManager audioDeviceManager;
    Looper looper;
    Looper looper2;
    Looper looper3;
    Looper looper4;

当我按下传输栏上的播放按钮时,它只播放第一个弯针。

有没有办法可以让它玩所有的游戏而不仅仅是第一个?

1 个答案:

答案 0 :(得分:1)

你需要让TransportBarGui知道所有 lolors的存在。最小的改变看起来像是:

class TransportBarGui : public Component,
                    public Button::Listener,
                    public Timer
{
public:

    TransportBarGui(Looper& l1_, Looper& l2_, Looper& l3_, Looper& l4_);

    ~TransportBarGui();
private:
    TextButton playButton;
    Looper& looperRef1; //reference to looper
    Looper& looperRef2;
    Looper& looperRef3;
    Looper& looperRef4;

然后,您重复所有四个弯曲者的现有逻辑。但这有点令人讨厌 - 那里有很多重复。 (特别是如果你想在某个时候添加第五个弯针。)

我切换到指向loopers的指针向量:

class TransportBarGui : public Component,
                    public Button::Listener,
                    public Timer
{
public:

    TransportBarGui(const std::vector<Looper*>& loopers_);

    ~TransportBarGui();
private:
    TextButton playButton;
    const std::vector<Looper*>& loopers; // The loopers we care about.

然后播放按钮看起来像:

void TransportBarGui::buttonClicked (Button* button)
{
    if (button == &playButton)
    {
        for (const auto pLooper : loopers)
        {
            auto& looperRef = *pLooper;
            if (looperRef.getPlayState() == 0)
            {
                looperRef.setPlayState(1); //turn on looper
                DBG(looperRef.getPlayState());
                playButton.setToggleState(looperRef.getPlayState(), dontSendNotification);
        }
        playButton.setButtonText("Stop");
    }
}

这有点俗气,因为它将playButton切换状态设置了四次 - 但是你想要考虑如何处理一些loopers开始的情况,有些人不会。