2011-04-25 99 views
0

我有一個很大的問題,比我要發佈的要大得多,但如果有人可以幫助我,那麼它將從這裏順利航行。爲什麼我的向量不能識別我的派生類?

好的,我的指針向量拒絕承認它的派生類。讓我解釋。

我有一類戰士和嚮導從中派生的Player對象。 該作業要求我將所述對象(戰士和嚮導)存儲到Player對象的指針向量中。 這是我到目前爲止有:

vector<Player *> players; 
    cout << "Please enter the number of players" << endl; 
    cin >> numOfPlayers; 
    total = amountPlaying(numOfPlayers); 
for(int i = 0; i < total; i++) 
    { 
     temp = members(); 
     if (temp == "Warrior" || temp == "warrior") 
      players[i] = new Warrior(); 
     if (temp == "Wizard" || temp == "wizard") 
      players[i] = new Wizard(); 
     else 
     { 
      cout << " wrong input, try again " <<endl; 
      i--; 
     } 
     cin >> *players[i]; 
    } 

成員函數:

string members() 
{ 
    string response; 
    cout << "Please select a Warrior or Wizard" << endl; 
    cin >> response; 
    return response; 
} 

我重載戰士和法師的接受通過CIN輸入,而不是播放器(如分配說不)。 這裏是戰士一個樣子(嚮導是相同的,但與精靈):

istream& operator>>(istream& in, Warrior& warrior) 
{ 
    int base_strength, base_weapon_level, base_weapon_type; 

    cout << "Please enter his/her weapon of choice (1 = sword, 2 = axe, 3 = bow, 4 = knife)" << endl; 
    in >> base_weapon_type; 
    cout << "Please enter his/her weapon level" << endl; 
    in >> base_weapon_level; 
    cout << "Please enter strength" << endl; 
    in >> base_strength; 

    warrior.set_power(base_strength); 
    warrior.set_weapon_level(base_weapon_level); 
    warrior.set_weapon_type(base_weapon_type); 
    return in; 
} 

現在的問題是,我得到這個錯誤(與CIN行>> *玩家[1]):

錯誤C2679:二進制「>>」:沒有找到運營商 這需要類型的右手操作數 「球員」(或沒有 可接受的轉化率)

現在怎麼辦我解決這個問題?我覺得它不會把它當作戰士或者嚮導,它總是把它當作一名球員,但我不想那麼做!

P.S.我知道這一切似乎都是多餘的,遠離優化,但這正是我的教授想要完成的。 :|

任何幫助將不勝感激,因爲我一直堅持這個小時!謝謝謝謝謝謝!

-Jon

+0

你確定你的教授不想讓你做球員的抽象類和>>操作虛擬? – jabbie 2011-04-25 03:45:42

+0

我的教授說我只能把操作員>>重載在Warrior和Wizard中。 這不是抽象的,我之所以這樣說的唯一原因是因爲我班的人不在抽象類是她將作爲一項任務的地方。 – Apothem 2011-04-25 04:14:04

回答

1

因爲當你解引用指針,玩家在這裏你receieving這個錯誤,你得到Player對象,而不是戰士或精靈:

cin >> *players[i] 

和球員的對象不具備正如你所說的那樣operator>>()

可能的解決方案:
1.使用dynamic_castPlayer*轉換爲Wizard*Warrior*在運行時。你可以嘗試,但有更方便的方法。示例代碼:

Wizard * pwizard = dynamic_cast <Wizard*>(players[i]); 
if (pwizard) { 
    // work with pwizard 
} 
else { 
    Warrior * pwarrior = dynamic_cast <Warrior*>(players[i]); 
    if (pwarrior) { 
    // work with pwarrior 
    } 
} 
+0

像動態鑄造一樣令人討厭,它爲我解決了問題。 我感謝您的幫助和大家的幫助! 我打算跟教授談談爲什麼她不讓我們在Player類中使用istream。 再次感謝你們。 – Apothem 2011-04-25 04:21:35

+0

你的'operator <<'(應該是'operator >>',btw)不能是成員函數,因此不能是虛擬的。 – 2011-04-25 09:26:28

+0

@Marcelo Cantos:是的,我的錯,謝謝。我已經重新編輯了我的答案,並在考慮這個主題時閱讀了一些關於計算器的閱讀) – beduin 2011-04-25 11:15:42

0
cin >> *players[i]; 

這是造成問題。你有沒有過載operator>>爲:

std::istream & operator>>(std::istream & in, Player &player); 
0

的問題是,你的operator>>實際上是期待一個戰士操作,但矢量持有的玩家。

您可以從派生類向派生樹上工作,但工作並不是一個好主意。 可以爲通用的Player類實現operator>>,然後對它們進行操作,就好像它們是Wizard或Warrior一樣。或者,在您的操作符>>內,您可以調用在這兩個派生類中實現的純多態函數,然後這將爲您完成工作。

希望這有助於

+0

OP聲稱家庭作業的條款是這樣的,他不允許爲通用的'Player'類實現一個'operator >>'。 – QuantumMechanic 2011-04-25 04:00:56

+0

昆騰是正確的,因爲我的侷限性,我只能希望嘗試像下面說的人那樣動態演員。 – Apothem 2011-04-25 04:17:50

+0

爲了回答他的問題,以上是爲什麼'矢量類不識別[他]派生類'。就實際設計而言,這是對他現有算法的簡單重新思考 - 但我理解你的觀點。 – 2011-04-25 04:19:06

0

你的教授可能被禁一個基類operator>>,因爲這是行不通的。您無法使規範流讀操作變爲虛擬,因爲第一個參數是流,而不是基類。

通常的解決辦法是這樣的:

class Player { 
    ... 
    virtual std::istream& read(std::istream& is) = 0; 
    ... 
}; 

std::istream& operator>>(std::istream& is, Player& p) { return p.read(is); } 
相關問題