Использование Array & Range-Based For Loop для замены некоторых основных строк кода - PullRequest
0 голосов
/ 01 октября 2018

Я использую 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 предназначен для того, чтобы объекты LabeledSliders были определены, сделаны видимыми и организованы через FlexBox.Это позволяет группировать кнопки:

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" };

};

Я хочу иметь возможность заменять списки объектов LabeledSlider, определенные вручную, на массивы и циклы.Таким образом, я могу определить члены каждого массива для каждого объекта LabeledGroup отдельно в других местах реализации.

Например.Создать объект LabeledGroup с именем «envelope» с ручками «Attack, Decay, Release, Sustain».И еще один объект LabeledGroup, называемый «искажение», с ручками «Drive, Level».

В качестве первого шага для этого я хотел бы реализовать некоторые базовые массивы в классе LabeledGroup, который у меня уже есть для тестирования.

В простейшем случае я хотел бы заменить строки:

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

на:

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

Нет ошибок при этом.Но ручки больше не отображаются, когда я строю с использованием этой замены.Так что это явно не работает.Должен ли цикл for повторить четыре строки, которые уже есть?Если нет, что я делаю не так в цикле?

Спасибо.

1 Ответ

0 голосов
/ 01 октября 2018

Ваша первая попытка не работает, потому что 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)

...