2012-06-19 137 views
0

我對C++非常陌生,並且遇到了將指針向量傳遞給對象的問題。具體來說問題是對象是類中的方法是在子類中,我得到一個錯誤:如何在超類方法的參數中使用子類?

'Player' was not declared in this scope 

PlayerVisual,在我的文件Visual.cpp一個子類,我有以下功能,也在我的頭文件中聲明。

bool Visual::DrawStatusInformation(Timer* timer, std::vector<Player*>* playerList) { 
    // Draw Info 
} 

我曾嘗試着宣佈我的頭文件class Player;,但我得到的錯誤:

error: invalid use of incomplete type ‘struct Player’ 
error: forward declaration of ‘struct Player’ 

我認爲問題是,我的定義是圓形的,球員延伸視覺,但視覺必須知道球員以便能夠處理Player指針的矢量。

我的問題是:

如果可能的話,我怎麼能在一個超類方法的參數使用一個子類?

+2

問題是:爲什麼基類應該知道它的任何派生類?理想情況下,它不應該。這是你設計中的問題。 –

+0

它不知道'Player'是什麼,所以它給你一個編譯錯誤。 – 2012-06-19 12:29:16

+0

你可以在通過它們之前將你的後代類別轉換爲它們的父類型,但基本上Als在他們說你的架構是錯誤和顛倒的時候是正確的。 – Rook

回答

1

Player extends Visual but Visual must know about Player in order to be able to deal with a vector of Player pointers.

通過文件:

  • Player.h - 包括Visual.h &舉措的實施,以實現文件
  • Player.cpp - 應該確定
  • Visual.h - 正式宣佈Player
  • Visual.cpp - 包括Player.h

這只是修復編譯錯誤,但你的設計似乎也有問題。如果PlayerVisual得出,爲什麼該方法

Visual::DrawStatusInformation(Timer* timer, std::vector<Player*>* playerList) 

存在嗎?我相信你可以用

Visual::DrawStatusInformation(Timer* timer, std::vector<Visual*>* playerList) 

替換它,並覆蓋它在Player。另外,爲什麼vector*而不是vector&

+2

@我有,你看過答案嗎?我說他應該在實現文件中包含Player.h。 –

+0

OP沒有顯示定義'class Visual'的頭文件,你的回答只是假設'Player'類型正在被使用,以至於它的內存佈局不需要在定義'Visual'的頭文件中知道,很顯然,這裏的問題在於OP有一個糟糕的(實際上是錯誤的)設計。當我降低評論並​​添加評論時,你的回答沒有任何提及,你可能稍後會隱身編輯它,但對這個問題的回答顯然是變化的在設計中不是解決方法。 –

+0

OP的整個設計很臭......爲什麼要傳遞一個Timer指針和Visual指針?應該是const引用。 – 2012-06-19 12:40:16

3

我會考慮重新設計。繼承模型是,一個關係,而這又意味着,在您的設計,Player是,一個Visual,因此它知道其他Player一個如何DrawStatusInformation。這似乎是合理的嗎?

您可能想要提供一個接口,每一個元素就是繪製工具,包括Player,然後提供一個類型,是能夠得出任何是繪製,特別是潛在的Player秒。這樣做,你會打破循環依賴,設計會更加健全。

請注意,這不是實現問題,而是設計問題。如果您真的認爲這是您問題的最佳設計,那麼您可以將前向聲明與包含在內的前向聲明結合起來,就像Luchian已經提到的那樣。

+0

+1建議修復真正的問題而不是解決方法。前向聲明的解決方法遲早會引起痛苦。 –

相關問題