【发布时间】:2015-11-04 04:59:42
【问题描述】:
有没有办法设计一个类,它及其后代都不能自动分配(在堆栈上),而只能动态分配(在堆中)?
我有一个由场景树表示的 3D 场景,每个对象都有一个父对象和多个子对象。所有场景对象都继承自某个基类SceneObject。我想让它不可能在堆栈上分配这样的对象。
我知道为一个类实现这一点的唯一方法是声明一个受保护的构造函数并提供一个工厂(参见Is it possible to prevent stack allocation of an object and only allow it to be instantiated with 'new'?)。这确实像我想要的那样适用于班级,但不适用于它的后代。派生类的作者需要将构造函数显式声明为非公共的,而我无法控制它,从而提供了出错的可能性。
有没有可能实现我想要的?有什么妥协吗?
【问题讨论】:
-
妥协:不要把一个类设计得太糟糕以至于不能在堆栈上实例化。这表明你做的很糟糕。
-
@Puppy 我同意。事实上,这个类已经设计好了,我能做的就是创建某种包装器,对现有代码的干扰最小。
-
@EdHeal 我认为这是一个可能的妥协。为了使这项工作如我所愿,我们需要从客户端代码中完全隐藏派生类型,并使它们仅可用于工厂代码。但是,这将不允许将模板函数用作工厂,并要求工厂查看所有类型。它非常适合 C 接口,但我认为不是 C++ 代码的好解决方案。
-
一个接口模式以及解耦
-
@EdHeal 如果我理解你的想法(而且我不完全确定我是否理解),它将需要对现有架构进行重大更改,这是我们无法承受的。
标签: c++ dynamic-memory-allocation