gpt4 book ai didi

c++ - 使用基于数组和范围的 For 循环替换一些基本代码行

转载 作者:行者123 更新时间:2023-11-28 04:32:12 26 4
gpt4 key购买 nike

我正在使用 JUCE/C++。我有两个相互交互的类,如下所示。

第一个类“LabeledSlider”用于创建一个带有标签的旋钮:

class LabeledSlider : public GroupComponent

{
public:
LabeledSlider(const String& name)
{
setText(name);
setTextLabelPosition(Justification::centredTop);
addAndMakeVisible(slider);
}

void resized() override
{
slider.setBounds(getLocalBounds().reduced(10));
}

Slider slider
{
Slider::RotaryHorizontalVerticalDrag, Slider::TextBoxBelow
};


};

第二个类 LabeledGroup 用于定义 LabeledSliders 的对象,使其可见并通过 FlexBox 进行组织。这是为了允许旋钮分组:

class LabeledGroup : public GroupComponent

{
public:
LabeledGroup(const String& name)
{
setText(name);
setTextLabelPosition(Justification::centredTop);


addAndMakeVisible(dummy1);
addAndMakeVisible(dummy2);
addAndMakeVisible(dummy3);
addAndMakeVisible(dummy4);

}

void resized() override
{
//setBounds(getLocalBounds().reduced(10));

FlexBox knobBox1;
knobBox1.flexWrap = FlexBox::Wrap::wrap;
knobBox1.justifyContent = FlexBox::JustifyContent::flexStart;
knobBox1.alignContent = FlexBox::AlignContent::flexStart;

Array<LabeledSlider*> knobs1;
knobs1.add(&dummy1, &dummy2, &dummy3, &dummy4);

for (auto *k : knobs1)
knobBox1.items.add(FlexItem(*k).withMinHeight(80.0f).withMinWidth(80.0f).withFlex(1));

FlexBox fb1;
fb1.flexDirection = FlexBox::Direction::column;
fb1.items.add(FlexItem(knobBox1).withFlex(2.5));
fb1.performLayout(getLocalBounds().toFloat());

}


private:
LabeledSlider dummy1{ "Dummy 1" };
LabeledSlider dummy2{ "Dummy 2" };
LabeledSlider dummy3{ "Dummy 3" };
LabeledSlider dummy4{ "Dummy 4" };

};

我希望能够用数组和 for 循环替换手动定义的 LabeledSlider 对象列表。这样我就可以在实现的其他地方分别为每个 LabeledGroup 对象定义每个数组的成员。

例如。使用旋钮“Attack、Decay、Release、Sustain”创建一个名为“envelope”的 LabeledGroup 对象。还有另一个名为“失真”的 LabeledGroup 对象,带有“Drive、Level”旋钮。

作为执行此操作的第一步,我想在用于测试的 LabeledGroup 类中实现一些基本数组。

最简单的,我想替换这些行:

addAndMakeVisible(dummy1);
addAndMakeVisible(dummy2);
addAndMakeVisible(dummy3);
addAndMakeVisible(dummy4);

与:

LabeledSlider group1string[] = { "dummy1", "dummy2", "dummy3", "dummy4" };
for (LabeledSlider& i : group1string)
{
addAndMakeVisible(i);
}

这样做没有错误。但是当我使用这个替代品构建时,旋钮不再出现。所以它显然没有发挥作用。该 for 循环是否应该复制已经存在的确切四行?如果不是,我在循环中做错了什么?

谢谢。

最佳答案

您的第一次尝试不起作用,因为包含并拥有您的 LabeledSlidergroup1string 是构造函数的局部变量,并在其末尾被销毁。您仍然希望将它们存储在一个成员变量中,以便您的对象拥有它们。

将成员变量替换为:

private:
std::vector<LabeledSlider> _sliders;

...然后初始化看起来像:

for(std::string const &name : {"dummy1", "dummy2", "dummy3", "dummy4"})
addAndMakeVisible(_sliders.emplace_back(name));

... resize() 中的用法变为:

for(LabeledSlider &slider : _sliders)
knobs1.add(&slider);

(未测试缺少 MCVE)

关于c++ - 使用基于数组和范围的 For 循环替换一些基本代码行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52586234/

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