我可以在构造函数中使用固定器

May I use setters in constructors?

本文关键字:固定器 构造函数 我可以      更新时间:2023-10-16

我已经构建具有相当复杂的设置过程的时间板类。将有几个构造函数。在构造函数中打电话给二传器是个坏主意吗?

我知道,如果设置器在派生的类中被覆盖,我不应该直接调用非私人设置器以避免问题。我想到要么创建真实的设置器私有,然后将公共设定器缠绕在构造函数中,以避免必须将其宣布为最终。

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逻辑。这意味着您只需要在一个位置进行更改,而不是在设置器和构造函数中进行更改。