假设您编写了一个类A,构造函数是私有的(以防止其他人在堆栈上创建它)然后有一天另一个开发人员添加一个新的ctor,比如说A(int),并想在main()中使用:< / p>
A a(1)
在堆栈上创建它。你怎么防止这种情况?
我的解决方案:
声明公共构造函数
A(void& input )
{
Cerr << “please do not create it on stack” << endl ;
exit(1);
}
我不确定它是否正确?
感谢
答案 0 :(得分:8)
正如其他人所说,你不能阻止那些可以编辑你的班级的人做任何事情......但是......
...如果你想要一个比注释更强的编译器可执行方法,你可以继承一个没有默认构造函数的类。编写构造函数的任何人(希望)都会注意到它。你可以让它的名字提示人们采取某些预防措施。
这样的事情:
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()
而无需访问源代码行并复制“嘿,不要让你的构造函数公开!”文本。但默认情况下,他们第一次尝试时仍会遇到编译器错误。
答案 1 :(得分:7)
发表评论说:
class A
{
private:
// This is private on purpose to prevent allocation on the stack.
// We'll fire you if you ever write a new constructor that isn't private.
A();
};
这个评论是诙谐的(大多数情况下),但它指出了一个重要的概念。禁止堆栈分配等代码约定需要通过同行评审来强制执行。正如其他人所说,其他人理论上可以改变他们想要的代码。但是,良好的同行评审过程将有助于控制这一点。恕我直言,这比新员工可能不一定理解的一些聪明的编译技巧更具成本效益。
答案 2 :(得分:5)
答案 3 :(得分:1)
我认为您需要的解决方案是以下步骤。
我相信这些步骤可能是您问题的解决方案。