2017-04-15 64 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)當我嘗試

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

刪除項目將編譯好的,如果我手動放在delete[] current ->id;,但做到這一點按原樣編譯

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,你的析構函數將被調用兩次,所以你會得到一個雙免費腐敗是你的構造函數試圖釋放id內存。

建議:爲了避免使用友元類,你的情況,nextprev成員都與list,而不是rec類。所以,你的list類可以有一個嵌套的裝飾類,將包裝你rec類,如:

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

然後將列表的邏輯將從您rec類的邏輯很好地隔離。