正如其他人說,你不能阻止誰可以使它做幾乎任何編輯類人......但
...如果你想有一個稍微編譯器強制執行的方法比評論,你可以繼承一個沒有默認構造函數的類。任何撰寫構造函數的人都會(有希望)引起注意。你可以讓它的名字提醒人們採取一定的預防措施。
事情是這樣的:
class DoNotStackConstruct {
protected:
DoNotStackConstruct(const char* dummy) {}
};
class A : protected DoNotStackConstruct {
private:
A() : DoNotStackConstruct ("PLEASE make all A constructors private!") {
// your code here
}
public:
static std::tr1::shared_ptr<A> newA() {
return std::tr1::shared_ptr<A>(new A);
}
/* ... a bunch of code ... */
/* ... then someone later adds the following ... */
public:
A (int i) {
// can't force them to make it private, but...
// this won't compile without mentioning DoNotStackConstruct
}
};
一旦你開始使用C++ 11會出現 「委託構造函數」,這一招將有少一點的牙齒:
Can I call a constructor from another constructor (do constructor chaining) in C++?
然後他們將能夠委託A()
而無需訪問源代碼行並複製「嘿,不要讓您的構造函數公開!」文本。但是默認情況下,他們第一次嘗試時仍會收到編譯器錯誤。
請問*你爲什麼要防止這種情況發生?給我們一個有說服力的理由,我們可以給你一個更好的實現基礎。 – Xeo
@BenjaminLindley C++的一個重要特點是讓人們儘可能多地在編譯時強制執行代碼庫規則。他們都不會是完美的......你可以爭辯說,不應該爲const而煩惱,因爲可以編輯你的代碼的人可以把它const_cast去掉,但const正確性無論如何都會遇到很多錯誤。想要使用書中的每一個技巧來幫助實施代碼庫的實踐和協議並減少錯誤,沒有什麼是「愚蠢的」。對於這種情況甚至可以這樣做...查看我的答案。 – HostileFork
@HostileFork:除了在C++中,只要你可以構造一個對象,只要你願意就可以構造它。 'A a;'和'std :: unique_ptr a'之間有什麼大區別?'?我都是爲了編譯執行,你提出的解決方案是有趣的,不是太侵入,但在這種情況下,它並沒有真正的工作。 –