在 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
}
我正在使用 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
}