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

Using an Array & Range-Based For Loop to replace some basic lines of code

本文关键字:替换 循环 For 代码 范围 于数组 数组      更新时间:2023-10-16

我正在使用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,旨在通过FlexBox定义,使LabeledSliders的对象可见和组织。这是为了允许对旋钮进行分组:

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 对象单独定义每个数组的成员。

例如。创建一个名为"信封"的 LabeledGroup 对象,其中包含旋钮"攻击、衰减、释放、持续"。另一个称为"失真"的 LabeledGroup 对象带有旋钮"驱动器,电平"。

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

简单来说,我想替换这些行:

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

跟:

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

这样做没有错误。但是当我使用此替换进行构建时,旋钮不再显示。所以它显然不起作用。对于循环是否应该复制已经存在的确切四行?如果不是,我在循环中做错了什么?

谢谢。

您的第一次尝试不起作用,因为包含并拥有您的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(