2017-04-15 66 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类的逻辑很好地隔离。