2016-04-26 196 views
0

我對C++相對比較陌生,我正在嘗試編寫一個簡單的2D引擎。但是,目前的結構在其他語言(AS3等)中還是有問題的。我有兩個類,一個叫DisplayObject,另一個叫DisplayObjectContainer。 DisplayObjectContainer是DisplayObject的子類,但DisplayObject有一個指向DisplayObjectContainer父級的指針作爲屬性。我無法想出一種方法在他們的文件中正確包含對方。我無法在DisplayObject中轉發聲明DisplayObjectContainer,因爲我需要訪問DisplayObject中的DisplayObjectContainer方法。C++循環依賴關係

的DisplayObject:

class DisplayObject 
{ 
    public: 

     DisplayObjectContainer *parent; 
... 
    ...this->parent->globalTransform... 
... 

的DisplayObjectContainer:

class DisplayObjectContainer : public DisplayObject 
{ 
    public: 
     DisplayObjectContainer(); 
     virtual ~DisplayObjectContainer(); 

    protected: 

    private: 
}; 

任何幫助,將不勝感激。謝謝!

+0

首先,爲什麼父類知道一個特定的派生類?無論如何,你需要在包含'DisplayObject'的頭文件中使用一個前向聲明(它只包含一個未被解引用的DisplayObjectContainer *),並將include包含在源文件中(例如'DisplayObject.cpp ')爲'DisplayObject'。 –

回答

1

有幾種方法可以解決您的問題,最簡單的就是簡單地將DisplayObject分成單獨的類和類實現。所以你有在頭文件中定義的類,並且在單獨的源文件中實現了成員函數。

這樣DisplayObject的頭文件不需要DisplayObjectContainer的頭文件,所需要的只是DisplayObjectContainer類的前向聲明。

像這樣的事情在頭文件

#pragma once 

// Forward declaration of the class 
class DisplayObjectContainer; 

class DisplayObject 
{ 
private: 
    DisplayObjectContainer *parent; 
    ... 
}; 

和源文件在你包含頭文件:

#include "DisplayObject.h" 
#include "DisplayObjectContainer.h" 

// Here you can use the members of DisplayObjectContainer 

較硬的辦法是改變設計,使DisplayObject實際上並不需要知道它存儲在哪個容器中。從長遠來看,這種解耦可能會更好,但如上所述需要重新設計您的項目。

+0

不應該僅僅因爲重複而關閉? –

+0

謝謝!第一個建議解決了這個問題。對於第二個建議,我會考慮重新設計它,儘管我遵循的結構與Adobe Flash具有完全相同的結構。 – TommyX