Jac*_*ack 4 c++ constructor private class object
假设您编写了一个类A,构造函数是私有的(以防止其他人在堆栈上创建它)然后有一天另一个开发人员添加一个新的ctor,比如A(int),并想在main()中使用:
A a(1)
在堆栈上创建它.你怎么防止这种情况?
我的解决方案
声明一个公共构造函数
A(void& input )
{
Cerr << “please do not create it on stack” << endl ;
exit(1);
}
Run Code Online (Sandbox Code Playgroud)
我不确定它是否正确?
谢谢
正如其他人所说,你不能阻止那些可以编辑你的班级的人做任何事情......但是......
...如果你想要一个比注释更强的编译器可执行方法,你可以继承一个没有默认构造函数的类.编写构造函数的任何人(希望)都会注意到它.你可以让它的名字提示人们采取一些预防措施.
像这样的东西:
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
}
};
Run Code Online (Sandbox Code Playgroud)
一旦你开始使用C++ 11,就会有"委托构造函数",这个技巧会少一点牙齿:
我可以在C++中从另一个构造函数(构造函数链接)调用构造函数吗?
然后,他们将能够委托,A()而无需访问源代码行并复制"嘿,不要让你的构造函数公开!" 文本.但默认情况下,他们第一次尝试时仍会遇到编译器错误.
发表评论说:
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();
};
Run Code Online (Sandbox Code Playgroud)
这个评论是诙谐的(主要是),但它指出了一个重要的概念.禁止堆栈分配等代码约定需要通过同行评审来强制执行.正如其他人所说,其他人理论上可以改变他们想要的代码.但是,良好的同行评审过程将有助于控制这一点.恕我直言,这比新员工可能不一定理解的一些聪明的编译技巧更具成本效益.
| 归档时间: |
|
| 查看次数: |
1909 次 |
| 最近记录: |