2011-05-18 28 views
2

我正在做一些遊戲設計,並決定我想要一個以數據爲中心的模型......一個從子系統傳遞到子系統的「遊戲數據」對象,並且知道它應該如何繪製,物理應該如何操作如何從用戶輸入會影響它等這個繼承結構是否存在切片問題?

於是我開始了像「BaseRenderer」「BaseInputHandler「監聽器」雜交物」等:

class BaseRenderer 
{ 
public: 
    virtual void Render(BITMAP *b) = 0; 
}; 

class BaseInputHandler 
{ 
public: 
    virtual int TakeInputs() = 0; 
}; 

創造了「GAMEDATA」對象,它繼承從這些...

class GameData : public BaseRenderer, public BaseInputHandler, public BaseCalculator 
{ 
public: 
    /* Virtual Overwrites: (each child of GameData will need to overwrite these!) 
    void Render(BITMAP *b); 
    int TakeInputs(); 
    void Calculate();*/ 
}; 

然後每個子系統都有一個單將執行各種操作(渲染,走投入等)對遊戲數據...

GameData gd; // Or inherited from GameData... 
Input::System().Init(); 
... 
while(loop) { 
    loop &= !(Input::System().GetInputs(&gd)); 
    ... 
} 

這是做傳承的有效和合理的方式?我問的原因是因爲我得到晦澀的運行時崩潰......沒有分配任何動態內存。昨天晚上,我在GameData中添加了2個成員函數(虛擬或非虛擬),然後當我慢慢添加它們(前1個非虛擬,1個虛擬,2個非虛擬等)時,它就消失了。

我讀了一些關於繼承和切片的內容(不記得現在在哪裏)。我沒有真正理解它,但是我在繼承中導致了間歇性的運行時錯誤?

或者我應該看看使用QueryPerformanceCounter的計時碼嗎?

的MinGW +快板

+0

我想你的意思是*切片*而不是*拼接*。切片解釋[這裏](http://stackoverflow.com/questions/4403726/)。我不認爲這是你的問題。你在這裏展示的看起來不錯。你必須詳細描述你所遇到的崩潰。 – 2011-05-18 09:25:50

+0

@Bingo,我看起來很好。你應該寧願發佈你遇到的崩潰或動態內存問題。 – iammilind 2011-05-18 09:26:21

+0

切片,不拼接。如果通過指針或引用傳遞對象,這可能不是一個風險。如果按值傳遞,派生類可能變成基類,那麼它確實會發生。 – 2011-05-18 09:27:38

回答

1

切片,當你通過值出現。如果您的基本類型是抽象的(具有純虛函數),則不會發生切片;編譯器會反而抱怨。 (複製對象時發生切片,但僅複製基類)

只要您不嘗試使用值語義(按值傳遞等),您的層次結構應該沒問題;在大多數情況下,在這種情況下,我會通過將所有內容都從boost::noncopyable系統地禁止複製,但只要所有的基礎都是抽象的,這並不是真的必要。

另一個需要注意的特殊問題是所有的顯式轉換都在指針或引用(而不是值)上,並且他們使用新的樣式類型(一般來說爲dynamic_cast)。當涉及多重繼承時,C風格的轉換可能會意外成爲reinterpret_cast,並且代碼將在此之後做出奇怪的事情。另外,當然,通常的問題也適用:沒有懸掛指針等(你說你沒有動態分配,如果你有多態類型,通常不應該支持拷貝,我覺得這很令人驚訝)。

+0

我只是說我沒有動態分配_yet_。我目前的遊戲數據只是一個盒子的座標......而這些只是從main()中的堆棧中的GameData繼承的類中的整數值。它最終會有配置,但沒有任何分配方式會導致崩潰......哦,謝謝你的回答:) – Bingo 2011-05-18 12:58:23