我可以在构造函数中使用固定器
May I use setters in constructors?
我已经构建具有相当复杂的设置过程的时间板类。将有几个构造函数。在构造函数中打电话给二传器是个坏主意吗?
我知道,如果设置器在派生的类中被覆盖,我不应该直接调用非私人设置器以避免问题。我想到要么创建真实的设置器私有,然后将公共设定器缠绕在构造函数中,以避免必须将其宣布为最终。
class A {
public:
A(sometype data1, sometype data2);
void setData1(sometype data1);
void setData2(sometype data2);
private:
void p_setData1(sometype data1);
void p_setData2(sometype data2);
};
A::A(sometype data1, sometype data2) {
p_setData1(data1);
p_setData2(data2);
}
void A::setData1(sometype data1) { p_setData1(data1); }
void A::setData2(sometype data2) { p_setData2(data2); }
void A::p_setData1(sometype data1) {
//Complex validation and calculations
}
void A::p_setData2(sometype data2) {
//Complex validation and calculations
}
有人有最佳实践吗?
“如果在派生的类中覆盖了设置器,我不应该直接致电非私人设置器以避免问题。
这在很大程度上不是问题。即使使用虚拟设置器,构造A
类时使用的定义也是动态类型A
的定义。与Java和C#相比,C 是安全的(在建立基本类别不变之前,虚拟呼叫最终以派生的类代码而最终出现,并且bang)。
关于最佳实践,这是对固定器和盖特斯的批评。他们确实具有具有内省的语言的目的,例如"设计师"工具可以使用它们,但在C 中不多。因此,最好的做法是总是问,我真的需要它们吗,我可以设计其他方法(例如move
而不是setxy
(听起来可能没有什么不同,但是考虑构造函数– move
的呼叫并不是这样。在施工过程中有很多意义))。
在构造函数中打电话给设置器是个坏主意吗?
no-使用构造函数内的设置器允许您在setter方法和构造函数中同时定义setter逻辑。这意味着您只需要在一个位置进行更改,而不是在设置器和构造函数中进行更改。
相关文章:
- 为什么不调用移动构造函数?(默认情况下只有构造器,没有别的)
- (SFML)按下键时,播放器构造函数未使用正确的动画进行更新
- std::string 构造函数如何处理固定大小的 char[]?
- 没有默认构造函数作为模板参数的自定义比较器
- 链接器错误:无法解析构造函数
- 使用迭代器的模板类的构造函数
- C++:复制迭代器的构造函数
- 为什么我的突变器函数没有设置任何内容?还是我的构造函数?
- C++ - 移动具有固定大小的 c 样式数组成员的类的构造函数
- 线程构造函数周围的可变参数模板包装器无法编译
- 具有值包装器的可变参数模板构造函数的类构造函数优先级
- 为什么 std::error_code 构造函数的第一个参数固定为 int
- Visual Studio在创建类时不再生成构造函数/解构器
- 如何实现构造函数,使其仅接受使用 typeid 的输入迭代器?
- 构造函数中初始化列表的计算顺序是否固定?
- c std :: vector迭代器构造函数,first == last
- 访问C 转换器构造函数中无关类的类的私人数据成员
- 我可以在构造函数中使用固定器
- 从另一个类调用迭代器构造函数
- 如何解决一系列关于迭代器构造函数的错误,包括期望的左值、缺失的转换和可行性