Как говорят другие, вы не можете помешать людям, которые могут редактировать ваш класс, заставить его делать почти все что угодно ... НО ...
... если вы хотите чуть более принудительного исполнения компиляторомМетод, чем комментарий, вы можете наследовать от класса, который не имеет конструктора по умолчанию.Любой, кто напишет конструктор, будет (будем надеяться) быть замеченным.Вы можете сделать так, чтобы его имя заставляло людей принимать определенные меры предосторожности.
Примерно так:
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, появятся "делегирующие конструкторы", и этот трюкбудет немного меньше зубов:
Могу ли я вызвать конструктор из другого конструктора (сделать цепочку конструктора) в C ++?
Тогда они смогут делегироватьA()
без посещения строки исходного текста и копирования "эй, не делайте ваш конструктор публичным!"текст.Но по умолчанию они все равно получат ошибку компилятора при первой попытке.