2016-09-19 2 views
-1

나는 이것을하기가 힘들다. 기본적으로 "Item"이라는 추상 기본 클래스에서 파생 된 "integer"라는 클래스가 있습니다. 나는 다음과 같이 객체를 정수로 포인터의 배열의 모든 요소를 ​​추가하려고 :정수 개체에 대한 포인터 배열의 요소를 더하는 것

class Item 
{ 
public: 
    virtual void print() = 0; 
    virtual string getType() = 0; 
    virtual Item* add(Item *item) = 0; 
}; 

class integer: public Item { 
private: 
    int data; 
public: 
    integer(int _data): data(_data){;} 
    void print() { 
     cout << data << "\n"; 
    } 
    string getType() { 
     return "INTEGER"; 
    } 
    integer* add(Item *item) { 
     if(this -> getType() != item -> getType()) { 
      throw "TYPE MISMATCH" ; 
     } 
     integer* tempInt = dynamic_cast<integer*>(item); 
     return new integer(this -> data + tempInt -> data); 
    } 
}; 

void printAll(Item** items, int n) { 
    for(int i = 0; i < n; ++i) 
     items[i] -> print(); 
} 

void addPrintAll(Item ** items, int n) { 
    Item* p = items[0]; 
    for(int i = 1; i < n; i++) { 
     p = p -> add(items[i]); 
    } 
    p -> print(); 
} 

void main() 
{ 
    int n = 10; 
    Item **integers = new Item*[n]; 
    Item **strings = new Item*[n]; 

    // populate lists 
    for (int i = 0; i < n; i++) 
    { 
     integers[i] = new integer(i); 
    } 

try 
    { 
     printAll(integers, n);  // print integers 
     addPrintAll(integers, n); // add integers 
    } 
    catch(char *e) 
    { 
     cout << e; 
    } 
} 

을 지금 addPrintAll 기능에서 그 라인에 :

p = p -> add(items[i]); 

나는 반복적으로 새를 호출하고 연산자를 삭제하지 않고 p에 저장하면 메모리 누수가 발생할 수 있습니다. 더 좋은 방법이 있나요?

+0

사용'표준 :: 벡터의 스마트 포인터. – vsoftco

+0

@vsoftco 이것은 할당이고 나는 C 스타일의 배열과 포인터를 사용해야한다. ( – Pantsuu

답변

1

클래스에 + =() 연산자를 구현할 수 있습니다. 항목으로는 정의되지 않습니다 : try 블록 내부

Item& operator+=(Item& other) { 
    if(other.getType() != getType()) { 
     throw "TYPE MISMATCH" ; 
    } 
    data += dynamic_cast<integer&>(other).data; 
    return *this; 
} 

그리고 주에를 같이 사용 : 정수 클래스에서

virtual Item& operator+=(Item& other) = 0; 

그것을 구현

integer sum(0); 
    for(int i = 0; i < n; ++i) 
     sum += *integers[i]; 
    sum.print(); 
+0

이것이 효과적이다! 도움에 감사 : D – Pantsuu