私营新运营商是否有任何意外的副作用?

the*_*Dmi 4 c++ stack raii new-operator

我在这个博客中读到,将新运算符设为私有是一种在堆栈上实施实例化的好方法.

我正在实现一个使用RAII习语的课程.这个类显然只应该在堆栈上实例化,所以我正在寻找一种强制执行的方法.

  • 我的问题是,这是否有任何不直接看到的副作用?
  • 它是一种在堆栈上实施实例化的好方法吗?
  • 有可移植性问题吗?

谢谢你的帮助!

编辑

我的RAII类只是实例化我正在处理的框架的各个部分,因此对该类执行任何其他操作与在堆栈上创建实例没有任何意义.

目标只是提供一个简单的可能性来配置框架并将其置于即用状态,而无需在客户端代码中实例化10个对象.

Ste*_*sop 7

这个类显然只应该在堆栈上实例化,所以我正在寻找一种强制执行的方法.

我猜这对用户来说不是很明显,如果你必须执行它......

主要缺点是它不起作用.

即使新的运算符是私有的,用户仍然可能会意外地将您的类用作自己类的数据成员或基类,然后使用它们实例化它们的类new.Foo *f = new Foo();当它们应该写时,它会阻止它们写入Foo f;,但它并没有强制它们对你的RAII类的使用与词法范围匹配,这可能是你真正想要强制执行的.

如果有人想要使用具有动态存储持续时间的锁(或其他),那么它们要么非常聪明,要么非常愚蠢.无论哪种方式,如果你让他们自己创造它,那么你无法阻止他们绕过你的限制.

你可以做的是让所有构造函数都是私有的(包括copy ctor),然后提供一个按值返回的友元函数.他们必须写:

const Foo &f = GimmeAFoo();
Run Code Online (Sandbox Code Playgroud)

标准要求将延长返回值的寿命,直至范围f.由于它们无法复制对象,因此无法使值超出引用范围.由于它们无法初始化数据成员或基类,因此无法使用该变通方法.但是请注意,它们必须采用const引用,因此如果您的类需要非const成员,它就不会起作用.

他们仍然可以做一些愚蠢的事情,比如像这样初始化他们自己的类的const引用数据成员,但是对象本身不会逃避发生这种情况的范围.他们将留下一个悬挂的参考,就像他们拿指针他们不应该的东西一样.

  • +1.不要试图阻止完全白痴,你无论如何都不能.教育班级用户如何使用它. (3认同)