在 C++ 中创建和释放临时虚拟变量

Creating and freeing a temporary dummy variable in C++

我正在使用 Qt 框架为我的业务逻辑创建 ui。 负责构建uiui的class提供了几种方法,这些方法逐步初始化ui元素,对它们进行布局,对它们进行分组,最后格式化(即 void MyUi::init3_formatUiElements()) 他们。

当然,某些 ui 元素需要设置大量布局设置,因此此方法可能看起来像

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 class 的成员字段。

我想要 _spinBox_distance 的 "temporary alias",因为上面的方法主体简化为

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

这将加快输入过程并使代码片段更多 copy/paste-able,尤其是对于 ui 相似类型的元素。

除了用大括号限定每个块的范围外

{ 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 之后那样工作,不能重新声明另一种类型。

使用宏怎么样?

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

从评论部分收集有关问题的基本概念性想法,我可能 post 问题的 syntactical/technical 答案。毫无疑问,这种方法不应该在任何类型的 "complex" 情况下选择(或者根本不应该选择)。

  • 糟糕的编码风格:
    • 不同事物同名
    • 名称并没有告诉您有关该对象的任何信息
  • 将重复的代码移至专用函数,这...
    • 可能专注于几种 ui 类型
    • 是模板函数
    • ...
  • 如果是 Qt:使用 Qt Designer。
  • ...

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

会成功的。

我认为您的代码看起来不错,我发现让代码易于 read/understand 比让代码易于编写更有用。请记住,您编写一次代码,然后必须多次阅读它。
在这种情况下,我可以更轻松地使用旧的(并且经常因错误而受到指责)复制和粘贴来编写。抓住 _spinBox_distance->set 并粘贴,完成该行,粘贴,完成该行,等等...

但是,如果您发现自己一遍又一遍地连续编写这 4 个 setter,则将它们放在一个接受 4 个参数的函数中。

void SetParameters(QDoubleSpinBox* spinBox_distance, double min, double max, double step, std::string suffix)
{
    //the setters
}