如何防止其他人在堆栈上创建您的类的新实例?

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)

我不确定它是否正确?

谢谢

Hos*_*ork 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
    }
};
Run Code Online (Sandbox Code Playgroud)

一旦你开始使用C++ 11,就会有"委托构造函数",这个技巧会少一点牙齿:

我可以在C++中从另一个构造函数(构造函数链接)调用构造函数吗?

然后,他们将能够委托,A()而无需访问源代码行并复制"嘿,不要让你的构造函数公开!" 文本.但默认情况下,他们第一次尝试时仍会遇到编译器错误.


Mic*_*fik 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();
};
Run Code Online (Sandbox Code Playgroud)

这个评论是诙谐的(主要是),但它指出了一个重要的概念.禁止堆栈分配等代码约定需要通过同行评审来强制执行.正如其他人所说,其他人理论上可以改变他们想要的代码.但是,良好的同行评审过程将有助于控制这一点.恕我直言,这比新员工可能不一定理解的一些聪明的编译技巧更具成本效益.


Oli*_*rth 5

显然,你无法阻止它.如果其他人可以直接编辑您的代码,那么他们可以做任何他们想做的事情.