2017-04-15 1 views
0

친구 클래스를 사용하고 있으며 내 목록 클래스에서 DeleteItem을 호출 할 때 rec의 소멸자를 사용하려고합니다. 그러나 삭제하려는 레코드를 가리키는 포인터가 있으므로 소멸자를 호출하는 방법을 모르므로 원하는대로 처리 할 수 ​​있습니다. 클래스 :친구 클래스에서 소멸자 호출

class rec 
    { 
      friend class list; 
     private: 
      char * id; 
      char firstname[15]; 
      char lastname[15]; 
      int ar[10]; 
      rec* prev; 
      rec* next; 
     public: 
      void SetData (char * id_in, char * fn, char * ln, int * ans_in); 
       rec(char *i, char *fn, char *ln, int *a); 
       rec(); 
      void operator= (const rec& r); 
       rec (const rec& r); 
      void Print(); 
       ~rec(); 
    }; 

    class list 
    { 
     private: 
      rec* first; 
      rec* last; 
     public: 
      int AddItem(rec r); 
      int DeleteItem (char* delid); 
      void PrintList(int order); 
      int ReadData(char *inanswer, char *inkey); 
      int WriteData(char *answer, char *key); 
       list(); 
      void operator= (list l); 
     private: 
      int CheckDuplicate(rec r); 
      void DeleteData(); 
      int Count(char *filename); 
    }; 

~ REC()

 rec :: ~rec() 
{ 
    if (id != NULL) 
    { 
     delete [] id; 
    } 
} 

의 deleteItem (Snipet) 내가 수동으로 delete[] current ->id;에 넣어하지만이 작업을 수행하면 내가하려고 할 때

int list :: DeleteItem(char *delid)  
{ 
    int id_counter; 
     rec *current = first; 
     while (current || current == NULL) 
      { 
      if (current == NULL) 
       { 
       return 0; 
       } 
      else 
       { 
       id_counter = strcmp(current -> id, delid);    
       if (id_counter != 0) 
        { 
        current = current -> next; 
        } 
       else 
        { 
        if (current == first && current != last)   
         { 
         ~rec();   //Here 
         first = current -> next; 
         delete current; 
         first -> prev = NULL; 
         return 1; 
         } 

삭제 항목이 잘 컴파일 그대로 컴파일하다

list.cpp:292: error: no match for ‘operator~’ in ‘~rec()’ 
/usr/lib/gcc/x86_64-redhat-linux/4.3.0/../../../../include/c++/4.3.0/bits/ios_base.h:105: note: candidates are: std::_Ios_Fmtflags std::operator~(std::_Ios_Fmtflags) 
/usr/lib/gcc/x86_64-redhat-linux/4.3.0/../../../../include/c++/4.3.0/bits/ios_base.h:145: note:     std::_Ios_Openmode std::operator~(std::_Ios_Openmode) 
/usr/lib/gcc/x86_64-redhat-linux/4.3.0/../../../../include/c++/4.3.0/bits/ios_base.h:183: note:     std::_Ios_Iostate std::operator~(std::_Ios_Iostate) 

내 소멸자가 고쳐야하는지, 아니면 DeleteItem에서해야 할 일인가요?

+0

여기에서 읽을 수 있도록 코드의 형식을 올바르게 지정하십시오. –

+0

나쁜 습관이 있기 때문에 "친구"없이 문제를 해결할 것을 고려하십시오. – 21koizyd

+4

소멸자를 명시 적으로 호출해서는 안됩니다. 물론이 수업에는 적합하지 않습니다. 원시 포인터와 배열도 피해야합니다. std :: string, std :: vector 및 std :: shared_ptr/std :: unique_ptr을 대신 사용하십시오. –

답변

2

소멸자를 호출하려면 구문은 current->~rec()이지만 대부분의 경우 C++에서 소멸자를 직접 호출하면 안됩니다. delete current을 호출하면 C++은 메모리를 할당 해제하기 전에 소멸자를 자동으로 호출합니다.

~rec()을 호출 한 후에도 delete을 사용하고있는 경우 소멸자가 두 번 호출되므로 생성자가 메모리를 해제하려고 시도 할 때 생성자가 두 번 무료로 손상됩니다.

조언 :가 귀하의 경우, 친구의 클래스를 사용 방지하기 위해, nextprev 회원은 list 관련, 그리고 rec 클래스에 있습니다. 그런 다음 목록의 논리가 잘 rec 클래스의 논리에서 분리됩니다

class list 
{ 
    struct item { 
     rec* value; 
     rec* prev; 
     rec* next; 
    }; 
    item * first; 
    item * last; 
public: 
    // ... 
}; 

: 그래서 당신의 list 클래스처럼 rec 클래스를 포장하는 중첩 된 데코레이터 클래스를 가질 수있다.