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

时间:2011-10-27 00:35:39

标签: c++ class object constructor private

假设您编写了一个类A,构造函数是私有的(以防止其他人在堆栈上创建它)然后有一天另一个开发人员添加一个新的ctor,比如说A(int),并想在main()中使用:< / p>

A a(1)

在堆栈上创建它。你怎么防止这种情况?

我的解决方案:

声明公共构造函数

  A(void& input )
   {
 Cerr << “please do not create it on stack” << endl ; 
  exit(1);
   }

我不确定它是否正确?

感谢

4 个答案:

答案 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)

我认为您需要的解决方案是以下步骤。

  1. 授予构造函数“私有”权限。
  2. 创建一个非成员静态函数,由new或malloc创建一个实例并返回它。
  3. 使用该功能创建班级实例。
  4. 我相信这些步骤可能是您问题的解决方案。