c++ - 使用多个声明引用另一个类

标签 c++

我正在创建一个音频应用程序,它有 4 个循环音轨和一个带播放按钮的传输条。我正在尝试让播放按钮在单击时同时播放所有 4 个 looper。

在我的 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 文件中,当按下按钮时,使用循环器引用播放循环器:

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 个循环器,您可以在这里看到:

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

当我按下传输杆上的播放按钮时,它只会播放第一个循环轨道。

有没有办法让它播放所有的循环器而不是只播放第一个循环器?

最佳答案

您需要让TransportBarGui 知道所有 looper 的存在。最小的变化看起来像:

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;

然后您对所有四个循环器重复现有逻辑。但这有点令人作呕——有太多的重复。 (特别是如果你想在某个时候添加第五个循环器。)

我会切换到指向 looper 的指针 vector :

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 切换状态四次 - 但您需要考虑如何处理一些 looper 启动而另一些不启动的情况。

关于c++ - 使用多个声明引用另一个类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34398834/

相关文章:

c++ - 找不到 Boost(缺少 : unit_test_framework) (found version "1.71.0")

c++ - IAT Hooking,QT库

C++多线程程序: Segementation fault with variables defined as class members

c++ - 添加到 C++ 中的集合

C++:通过数组创建的对象,但如何传递参数?

c++ - 从哪里可以获得有关创建 mpeg-1 视频编码器的教程?

c++ - 内存泄漏问题;删除指针

C++ 继承。更改对象数据类型

c++ - 复制构造函数中的模板

c++ - (new Class())->Function(); 是什么意思?意思是?