Создание и освобождение временной фиктивной переменной в C ++ - PullRequest
0 голосов
/ 19 сентября 2018

Я использую инфраструктуру Qt для создания пользовательского интерфейса для моей бизнес-логики.Класс, отвечающий за создание пользовательского интерфейса, предоставляет несколько методов, которые шаг за шагом инициализируют элементы пользовательского интерфейса, размещают их, группируют и, наконец, форматируют (т.е. void MyUi::init3_formatUiElements()) их.

Естественно, некоторые элементы пользовательского интерфейсатребуется множество настроек макета, поэтому этот метод может выглядеть так:

void MyUi::init3_formatUiElements() {
    _spinBox_distance->setMinimum(0.0);
    _spinBox_distance->setMaximum(10.0);
    _spinBox_distance->setSingleStep(0.5);
    _spinBox_distance->setSuffix(" meters");
    //...

    //same for other widgets
    return;
}

Объекты типа QDoubleSpinBox* _spinBox_distance являются полями-членами класса MyUi.

Я хотел бы иметь "временный"псевдоним "для _spinBox_distance, в том смысле, что тело вышеупомянутого метода упрощается до

void MyUi::init3_formatUiElements() {
    //create alias x for _spinBox_distance here
    x->setMinimum(0.0);
    x->setMaximum(10.0);
    x->setSingleStep(0.5);
    x->setSuffix(" meters");
    //...
    //free alias x here

    //same for other widgets: create alias x for next widget
    //...
    //free alias x here

    return;
}

Это ускорит процесс ввода текста и сделает фрагменты кода более копируемыми / вставляемыми, особенно для элементов пользовательского интерфейса подобногоtype.

Помимо определения объема каждого блока в фигурных скобках

{ QDoubleSpinBox*& x = _spinBox_distance;
x->setMinimum(0.0);
//...
}
{ QLabel*& x = _label_someOtherWidget;
//...
}

существует ли элегантный способ добиться этого?

Я пробовал приведенный выше синтаксис без определения объема, но с разрушениемx тогда, конечно, приводит к разрушению базового виджета.

Может быть

QDoubleSpinBox** x = new QDoubleSpinBox*;
x = &_spinBox_distance;
(*x)->setMinimum(0.0);
//...
delete x;

, но это не делает вещи намного проще для ввода текста (три дополнительные строки, указателик указателям, (*x)) ...: D

РЕДАКТИРОВАТЬ: Этот не работает, как после delete x, не может быть повторно объявлен другого типа.

Ответы [ 3 ]

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

Собирая основные концептуальные мысли о рассматриваемой проблеме из раздела комментариев, я могу опубликовать синтаксический / технический ответ на вопрос.Этот подход, без сомнения, не должен выбираться в какой-либо «сложной» ситуации (или, скорее, совсем нет).

  • плохой стиль кодирования:
    • одно и то же имя для разныхвещи
    • имя, которое ничего не говорит об объекте
  • перемещает повторяющийся код в выделенные функции, на которых ...
    • может специализироватьсянесколько типов пользовательского интерфейса
    • являются шаблонными функциями
    • ...
  • в случае Qt: Используйте Qt Designer.
  • ...

{ auto x = _spinBox_distance;
x->setMinimum(0.0);
//...
}
{ auto x = _label_someOtherWidget;
//...
}

добьется цели.

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

Я думаю, что ваш код выглядит так, как он есть, я считаю гораздо более полезным, чтобы код был легко читаемым / понятным, чем код, который легко писать.Помните, что вы пишете код один раз, а потом должны читать его много раз.
В таких случаях мне легче писать с помощью старого доброго (и часто обвиняемого в ошибках) копирования и вставки.Захватите _spinBox_distance->set и просто вставьте, завершите строку, вставьте, завершите строку и т. Д. *

Если, однако, вы обнаружите, что снова и снова пишете эти 4 сеттера подряд, то ставьте ихв 1 функцию, которая принимает 4 параметра.

void SetParameters(QDoubleSpinBox* spinBox_distance, double min, double max, double step, std::string suffix)
{
    //the setters
}
0 голосов
/ 19 сентября 2018

А как насчет использования макроса?

#define Set(argument) _spinBox_distance->set##argument

и

Set(Minimum(0.0));
Set(Maximum(10.0));
Set(SingleStep(0.5));
Set(Suffix(" meters"));

или

#define Set(Argument, Value) _spinBox_distance->set##argument(Value)

Set(Minimum, 0.0);
Set(Maximum, 10.0);
Set(SingleStep, 0.5);
Set(Suffix, " meters");
...