C++ 使用数组&;基于范围的For循环,以替换一些基本代码行

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);

我正在使用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定义、显示和组织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);