2009-10-16 31 views
0

this question跟進,人都建議我去 「選項3」,這可能是這樣的:不可能從這個對象繼承嗎?

class b2Body { 
private: 
    b2Body() {} 
    friend class b2World; 
}; 

class Body : public b2Body { 
private: 
    Body() {} 
    friend class World; 
}; 

class b2World { 
public: 
    b2Body *CreateBody() { 
     return new b2Body; 
    } 
}; 

class World : public b2World { 
public: 
    Body *CreateBody() { 
     return new Body; 
    } 
}; 

int main() { 
    World w; 
    Body *b = w.CreateBody(); 
    return 0; 
} 

Try it online

但有兩個主要問題是:

  1. Body永遠不能構建,即使使用World::CreateBody(因爲b2Body是私有的)
  2. 即使可以,那麼b2Body部分不會被正確初始化(b2World::CreateBody需要被稱爲)

這是否意味着我永遠無法從b2Body/b2World繼承和遵循同樣的設計模式? (請記住,我不能編輯b2 *類)

如果是這樣,我想你們會建議我只保留b2Worldb2Body作爲成員變量嗎?


我認爲現在可以歸結爲以下兩個選項:

回答

2

只有b2World可以創建一個b2Body所以這只是沒有去任何地方。這些類顯然不是爲了繼承而設計的,而是將它們聚合起來。那麼沿線的東西呢

class Body { 
public: 
    Body(b2Body* b) : b2b(b) {} 

private: 
    b2Body*const b2b; 
}; 

class World { 
public: 
    World() : b2w(/* create b2w here */) {} 

    Body *CreateBody() { 
      return new Body(b2w->CreateBody(/*...*/); } 
    } 
private: 
    b2World*const b2w; 
}; 
+0

不錯!然後'身體'不需要朋友'世界'。 http://codepad.org/CXufhOiY – mpen 2009-10-16 19:40:23