2014-05-23 5 views
1

인쇄 메서드를 사용하여 동일한 클래스를 상속하는 몇 가지 클래스가 있습니다. 맞춤형 동적 배열 템플릿 클래스도 있습니다. 하위 클래스의 객체에 대한 포인터의 동적 배열을 몇 개 만들었습니다. 모든 배열에 대해 포인터로 가리키는 개체의 모든 인쇄 메서드를 호출하기위한 별도의 함수가 필요합니다. 때때로 "무기"만 인쇄 할 수도 있고 때로는 "수정"또는 때로는 모든 것을 인쇄 할 수도 있습니다. 지금까지 나는 모든 배열에 대해 첫 번째 방법 (코드에 표시된대로)을 복사하여 붙여 넣거나 동적 배열을 "mother"클래스에 대한 포인터의 배열로 변환하고 새 배열을 범용 인쇄 기능. 주먹 방식에서 다섯 개 행을 복사 - 붙여 넣기, 또는 두 번째 방법에서 더 복잡한 다섯 개 행을 복사 - 붙여 넣기 다섯을 추가 : 그래서 두 가지 선택이함수의 인수로 자식 클래스의 개체에 대한 포인터의 템플릿 배열

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(); 
    } 

: 여기

그리고

몇 가지 코드 인쇄 기능을위한 더 많은 행. 하지만 실제로하고 싶은 것은 동적 배열을 인수로 전달하고 인쇄 기능에서 변환 (필요한 경우)을 수행하거나 printCertainStuff(modification); (또는 "weapon"또는 무엇이든)을 작성하여 단순히 "프린터"를 호출하는 것입니다. 그리고 이것은 전체 프로젝트의 설계에 필요합니다. 나는 선생님과 상담했지만 대답은 함수를 호출하기 전에 변환하지 않고는 할 수 없다는 것이 었습니다.

하지만 여전히 원하는 방식으로 논리적으로 그러한 동적 배열을 전달할 수있는 방법이 있습니까?

+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"); 

수정을 위해 비슷하게.