仅允许使用动态分配分配对象

时间:2011-08-13 07:35:55

标签: c++ coding-style c++11 dynamic-allocation new-operator

我正在开发一个小型图书馆,我对class X

有以下要求
  1. class X必须仅使用operator new
  2. 进行分配
  3. class X的所有子项都应隐式变为可分配的 只有operator new
  4. 堆分配的语法应该是优雅的
  5. 不应更改现有代码以合并此
  6. 在某段时间后,如果我想允许class X可分配 自动;再次没有太多代码应该改变
  7. 我也欢迎C ++ 0x解决方案(仅供将来使用)。

    [注意:我完成了我的部分研究,并将其作为答案发布(针对基本情景进行测试)]

1 个答案:

答案 0 :(得分:3)

// Dynamic.h
class OnlyDynamic
{
  template<class T> friend struct Dynamic;
  virtual void*** __Restriction () = 0;
};

template<class T>
class Dynamic : public T
{ 
  virtual void*** __Restriction () { return 0; }
  ~Dynamic();
public:
#ifdef Cpp0x
  template<typename... Args>
  Dynamic(Args... args) : T(args...) {}
#else
  Dynamic () {}
  template<typename A1> Dynamic(const A1 &a1) : T(a1) {}
  template<typename A1, typename A2> Dynamic(const A1 &a1, const A2 &a2) : T(a1,a2) {}
//...
  template<typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
  Dynamic(const A1 &a1, const A2 &a2, const A3 &a3, const A4 &a4, const A5 &a5, const A6 &a6) : T(a1,a2,a3,a4,a5,a6) {}
#endif 
};

<强>用法


假设,我想让class X只能动态分配;我应该简单地导出OnlyDynamic(访问说明符并不重要)并使用new Dynamic<X>()进行分配。

示例:

class Base {};

struct A : Base, OnlyDynamic  // <-- only inherit
{
  A (int i) {}
};

A *p = new Dynamic<A>(3);
delete p;

到目前为止,我看到所有给定的要求都已通过此解决方案得到满足。