2014-05-23 82 views
1

我有幾個類使用print方法繼承相同的類。我也有一個定製的動態數組模板類。我創建了一些動態的指向來自子類的對象的指針數組。對於每個數組,我希望有一個單獨的函數來調用指針所指向的所有對象的打印方法 - 有時我只打印「武器」,有時只打印「修改」或有時打印所有內容。到目前爲止,我已經嘗試了兩種解決方案 - 爲每個數組複製粘貼第一種方法(如代碼所示)或將動態數組轉換爲指向「母親」類的指針數組,並將新數組作爲參數傳遞給通用數據打印功能。作爲函數參數的子類對象的指針模板數組

這裏是一些代碼:

class Item {...} 
    class Modification : public Item {...} 
    class Equipment : public Item {...} 

    DynamicArray<Modification*> modification; 
    DynamicArray<Equipment*> weapon; 

    //The first way: 
    void printModsInfo() 
    { 
     if (modification.size() == 0) 
      cout<<"No mods in inventory\n"; 
     else 
      for (int i = 0; i < modification.size(); i++) 
       modification.returnElement(i)->printInfo(); 
    } 

    void printWeaponsInfo() 
    { 
     if (weapon.size() == 0) 
      cout<<"No weapons in inventory\n"; 
     else 
      for (int i = 0; i < weapon.size(); i++) 
       weapon.returnElement(i)->printInfo(); 
    } 

    //The second way: 
    void _printModsInfo() 
    { 
     Item** tempRef = new Item*[modification.size()];//array of pointers 
     for (int i = 0; i < modification.size(); i++)//converting DynamicArray<Modification*> into Item** tempRef 
      tempRef[i] = modification.returnElement(i); 
     printCertainStuffInInventory (tempRef, modification.size()); 
     delete tempRef; 
    } 

    void _printWeaponsInfo() 
    { 
    Item** tempRef = new Item*[weapon.size()]; 
    for (int i = 0; i < weapon.size(); i++) 
     tempRef[i] = weapon.returnElement(i); 
    printCertainStuffInInventory (tempRef, weapon.size()); 
    delete tempRef; 
    } 

    void printCertainStuff (Item** arr, int size) 
    { 
     if (size == 0) 
      cout<<"Nothing from this type in inventory...\n"; 
     else 
      for (int i = 0; i < size; i++) 
       arr[i]->printInfo(); 
    } 

所以,我有兩個選擇:複製粘貼的拳路五行,或更復雜的五行從第二條路複製粘貼,並新增5更多行用於打印功能。但我真正想要做的僅僅是將動態數組作爲參數傳遞,並在打印功能中進行轉換(如果需要),或者通過編寫:printCertainStuff(modification);(或「武器」或其他)來簡單地調用「打印機」。這是整個項目設計所要求的。我曾經諮詢過我的老師,但答案是在調用函數之前沒有轉換就沒有辦法做到這一點。

但仍然有辦法按照我想要的方式傳遞動態數組作爲參數嗎?

+0

聽老師。 – Steger

+0

我嘗試了其他方法,是的 - 真的沒有別的辦法。 – AlexSavAlexandrov

回答

1

我對你想要什麼並不清楚100%,但如果它是你所有的打印方法相結合,你可以嘗試使用模板:

template< class T > 
void printInfo (const T& arr, const char* failmessage) 
{ 
    if (arr.size() == 0) 
     cout<<failmessage; 
    else 
     for (int i = 0; i < arr.size(); i++) 
      arr.returnElement(i)->printInfo(); 
} 

然後使用武器你」 d去:

printInfo(weapon, "No weapons in inventory\n"); 

和類似的修改。

相關問題