代码之家  ›  专栏  ›  技术社区  ›  mike

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

  •  0
  • mike  · 技术社区  · 6 年前

    我使用JULS/C++。我有两个类,它们相互作用如下。

    第一类“LabeledSider”用于创建带有标签的旋转手柄:

    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循环替换中手动定义的LabeledSider对象列表。通过这种方式,我可以在实现的其他地方分别为每个labeledgroup对象定义每个数组的成员。

    创建一个名为“封套”的标签组对象,带有“攻击、衰减、释放、维持”旋钮。另一个标签组对象称为“失真”与旋钮“驱动,水平”。

    作为实现这一点的第一步,我希望在我已经用于测试的labeledgroup类中实现一些基本数组。

    最简单的是,我想替换以下行:

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

    用:

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

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

    谢谢。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Quentin    6 年前

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

    将成员变量替换为:

    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)