Установка переменных внутри этого класса, чтобы я мог объявить их для каждого объекта - PullRequest
0 голосов
/ 30 сентября 2018

Я работаю с C ++ в JUCE, но это общий вопрос C ++ для начинающих.

У меня есть этот класс:

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
    {

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

};

, который работает для создания 4 фиктивных объектов "LabeledSlider"внутри него делает их видимыми и использует функцию FlexBox для их организации.

Когда я вызываю этот класс в моем «MainContentComponent» (именно там моя программа визуально встроена в JUCE), вот так, он работает нормально:

class MainContentComponent : public Component

{
public:
    MainContentComponent()

    {
        addAndMakeVisible(group1);
    }

private:
    LabeledGroup group1{ "Group 1" };

Проблема, конечно, в том, что я создал и назвал все свои "фиктивные ручки" непосредственно внутри класса LabeledGroup, и вместо этого мне нужно установить их по-разному для каждого объекта этого класса.

т.е.Мне нужно указать только в MainContentComponent, что:

  • LabeledGroup group1{ "Group 1" } содержит «dummy1, dummy2, dummy3, dummy4» *
  • LabeledGroup group2{ "Group 2" } содержит «dummy5, ​​dummy6, dummy7».

Какой хороший или правильный способ сделать это?

Ответы [ 2 ]

0 голосов
/ 30 сентября 2018

Я бы предложил что-то вроде этого

#include<string>
#include<initializer_list>
#include <vector>

struct LabeledSlider {
    LabeledSlider (std::string ) {}
};

struct LabeledGroup {
    LabeledGroup(std::string name,
                 const std::initializer_list<std::string> slidersName) {
        for (auto &name: slidersName)
            sliders.push_back(LabeledSlider(name));
        for (auto &s : sliders)
              addAndMakeVisible(s);
    }

    std::vector<LabeledSlider> sliders;
};

int main() {
   LabeledGroup lg1("coucou", { "riri", "fifi", "loulou" });
   LabeledGroup lg2("hello", { "sam", "max" });
   LabeledGroup lg3("hello", { });
}
0 голосов
/ 30 сентября 2018

По запросу из комментариев:

#include<array>
#include<string>
std::array<LabeledSlider,4> genLabels(int startIndex)
{
     std::string dummy="Dummy";
     return std::array<LabeledSlider{
     LabeledSlider(dummy+std::to_string(startIndex)),
     LabeledSlider(dummy+std::to_string(startIndex+1)),
     LabeledSlider(dummy+std::to_string(startIndex+2)),
     LabeledSlider(dummy+std::to_string(startIndex+3))};
}
class LabeledGroup : public GroupComponent

{
public:
    LabeledGroup(const String& name, int startIndex)
    :dummies(genLabels(startIndex))
    {
        setText(name);
        setTextLabelPosition(Justification::centredTop);
        for(auto&& d: dummies)
            addAndMakeVisible(d);
    }

    void resized() override
    {

        FlexBox knobBox1;
        knobBox1.flexWrap = FlexBox::Wrap::wrap;
        knobBox1.justifyContent = FlexBox::JustifyContent::flexStart;
        knobBox1.alignContent = FlexBox::AlignContent::flexStart;

        for (auto&& d : dummies)
           knobBox1.items.add(FlexItem(d).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:
    std::array<LabeledSlider,4> dummies;

};
...