我必須用一個相當複雜的設置過程來構建一個時間跨度類。將會有幾個構造函數。在構造函數中調用setter是一個壞主意?我可以在構造函數中使用setter嗎?
我知道如果setter在派生類中被覆蓋,我不應該直接調用非私有setter來避免問題。我想過要麼創建一個真正的setter private幷包裝一個公共setter,並在構造函數中調用private setter以避免必須聲明它爲final。
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
}
有沒有人有最佳做法?
我在構造函數中看不到使用setter的問題。您可以重複使用代碼,而不是在構造函數和setter中定義相同的setter邏輯。雖然我不確定爲什麼你有私人和公共製片人。如果他們是公開的,就讓他們公開。 – bblincoe
注意:C++ 11帶來了構造函數的重用,例如,你可以使用'Foo(Radians r):Foo(r.toDegrees()){}'並且將所有構建邏輯委託給'Foo(Degrees d) ;'。注2:你的包裝器沒用,重要的不是你是否調用'public'或'private' setter,但是你是否在你的構造函數(或析構函數)中調用了一個**純虛擬**函數。 –
'我知道如果setter在派生類中被覆蓋,我不應該直接調用非私有setter來避免問題。'沒有問題。該類的動態類型是ctor中的_this type_。 –