2011-08-13 77 views
1

我在一個小圖書館工作,在那裏我有任何class X以下要求:允許只分配對象使用動態分配

  1. class X必須分配只能用operator new
  2. 所有class X孩子只有通過 operator new
  3. 應該含蓄地成爲分配的堆分配的語法應該是優雅的
  4. 沒有太多的現有代碼應該更改爲合併此
  5. 經過一段時間後,如果我想允許class X作爲自動分配 ;再次沒有太多的代碼應該改變

我也歡迎C++ 0x解決方案(僅供將來使用)。

[注:我已經做了我的研究的一部分,將被張貼作爲一個答案(測試基本場景)

+0

的可能重複[是否有可能阻止對象的堆棧分配,只允許它與「新」來instiated?](http://stackoverflow.com/questions/124880/is-it-possible-to -prevent-stack-allocation-of-object-and-only-allow-it-to-be-i) – cdhowie

+2

@iammilind:如果你已經有一個解決方案,你是否將這張貼發佈爲其他人的測試?如果不是,請張貼您的方法,然後徵求批評者的意見或支持。 –

+0

你的意思是「沒有太多現有的代碼應該改變」?我們不知道你現有的代碼是什麼,所以我們不能告訴你會有多大的變化。 – foxy

回答

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; 

截至目前,我看到所有給定的要求得到滿足與此解決方案。