C++ 使用数组&;基于范围的For循环,以替换一些基本代码行
我正在使用JUCE/C++。我有两个相互作用的类,如下所示 第一类“LabeledSlider”用于创建带有标签的旋钮:C++ 使用数组&;基于范围的For循环,以替换一些基本代码行,c++,class,object,variables,juce,C++,Class,Object,Variables,Juce,我正在使用JUCE/C++。我有两个相互作用的类,如下所示 第一类“LabeledSlider”用于创建带有标签的旋钮: class LabeledSlider : public GroupComponent { public: LabeledSlider(const String& name) { setText(name); setTextLabelPosition(Justification::centredTop);
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定义、显示和组织LabeledSider对象的地方。这是为了允许旋钮分组:
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循环是否应该复制已经存在的四行呢?如果不是,我在循环中做错了什么
谢谢。您的第一次尝试不起作用,因为
group1string
,它包含并拥有您的LabeledSlider
s,是构造函数的本地组件,并且在其末尾被销毁。您仍然希望将它们存储在成员变量中,以便对象拥有它们
将成员变量替换为:
private:
std::vector<LabeledSlider> _sliders;
。。。resize()
中的用法变成:
for(LabeledSlider &slider : _sliders)
knobs1.add(&slider);
(未测试是否缺少MCVE)使用LabeledSlider的向量,而不是四个单独的变量。请给出
addAndMakeVisible()
的定义-我的第一个猜测是参数的生命周期会产生不同,这是一个内置的Juce函数:Mat无论我使用向量还是数组,都必须执行相同的函数来替换这些行。如果它不适用于数组,我看不出它如何适用于向量,至少在这个早期的例子中没有任何不同。但是,是的,如果我能让向量长期工作,它可能会更好。你不应该写{{“dummy1”}、{“dummy2”}、{“dummy3”}、{“dummy4”}吗?我试过了,但它只是给出了一个错误消息:@mike你有一个额外的LabeledGroup
,它试图声明一个变量。
private:
std::vector<LabeledSlider> _sliders;
for(std::string const &name : {"dummy1", "dummy2", "dummy3", "dummy4"})
addAndMakeVisible(_sliders.emplace_back(name));
for(LabeledSlider &slider : _sliders)
knobs1.add(&slider);