使用基于数组和范围的 For 循环替换一些基本代码行
Using an Array & Range-Based For Loop to replace some basic lines of code
我正在使用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);
}
这样做没有错误。但是当我使用此替换进行构建时,旋钮不再显示。所以它显然不起作用。对于循环是否应该复制已经存在的确切四行?如果不是,我在循环中做错了什么?
谢谢。
您的第一次尝试不起作用,因为包含并拥有您的LabeledSlider
的group1string
是构造函数的本地,并在其末尾被销毁。您仍希望将它们存储在成员变量中,以便您的对象拥有它们。
将成员变量替换为:
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(
相关文章:
- 如何通过替换顺序代码的while循环来添加OpenMP for循环
- 将"-01"替换为"-02" 英特尔编译器选项会导致 FPE 在较小的 for 循环行程计数中抛出
- 使用基于数组和范围的 For 循环替换一些基本代码行
- 什么可以用来替换代码中的循环和 if 语句?
- C++代码在 for 循环的条件下给出运行时错误,而如果它被具有相同意义的代码替换,则编译正确
- C++ 转换和 lambda - 替换循环
- 在 C++ 中用递归替换循环的 N 级
- 将 for 循环替换为 while 循环
- 使用标准库将循环替换为 strtok
- 将循环(以及其中的条件)替换为按索引直接访问
- 尝试在自定义 QT 创建器文本编辑器中创建查找和替换循环.我似乎无法设置光标位置
- 如何在循环中替换旧值C++
- 用memcopy、memmove或std:copy替换For循环
- 通过宏替换展开循环无效
- 如何使用std算法来替换for循环
- 用指针替换循环索引器有什么好处吗?
- 如何替换我的"for"循环以通过 STL mimax 算法找到最小值/最大值
- C++字符串替换函数无限循环
- 用 while 循环替换我的 for 循环时我做错了什么
- 使用STL替换for循环