[英]Call method only once for EACH object of the class NOT STATIC
我寫了一個構造函數是私有的類。
我只需要一次將給定值分配給私有成員
在方法construct(int a)
。
它應該像構造函數,而不是構造函數!
第一次之后每次調用此construct(int a)
時,我都不需要為該特定對象重新分配任何內容。
如何在沒有布爾值的情況下實現這一目標?
我想到了boost::call_once
但它為整個類調用一次一次construct(int a)
! 我需要為每個對象調用一次此函數。
就像ctor! 有任何想法嗎?
更新1:構造函數是私有的。 但是該類有一些成員,這些值可以從外部分配,但只能一次
我正在嘗試實現一些自動化,以檢查是否使用bool wasCalled
類的函數是否已被調用。
更新2:
LT::Pointer lut = LT::New();
std::vector<double> points;
....
lut->construct(points);
第二次
lut->construct(points);
被稱為-應該給出錯誤,或者以某種方式使其無法執行。
直接回答 :
您可以設計一個將“一次分配”語義應用於包裝對象的包裝器。
但是,您不能使編譯器在編譯時檢測到第二次設置值,因此您應該准備在運行時聲明/拋出該值。
背景/環顧四周
正如其他人所說,這聞起來很像是設計缺陷。 為什么不能使用New
操作轉發構造函數參數(a-la make_shared
, make_unique
?):
template <typename T, typename... Args>
SmartPointer<T> genericNew(Args&&... args) {
return SmartPointer<T>(new T(std::forward<Args>(args)...));
}
當然,可能會有專門的工廠方法,甚至在建造后都知道如何設置私有財產。 在工廠創建后,使工廠方法成為朋友,以防止他人使用隱藏的屬性(setter):
struct X {
int a;
X(int i) : a(i) {}
typedef SmartPointer<X> Ptr;
static Ptr New(int a, int init_only) {
Ptr p(new X(a));
p->init_only = init_only;
return p;
}
private:
int init_only;
};
(在這里,我選擇使New
factory方法成為靜態成員,因此它暗中是朋友)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.