gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 05:54:54 25 4
gpt4 key购买 nike

我正在创建一个音频应用程序,它有 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com