从朋友班上调用灾难

calling the destructor from a friend class

本文关键字:调用 朋友      更新时间:2023-10-16

我正在使用朋友类,当我从列表类调用deleteitem时,我想使用rec的destructor。但是,有一个指向我要删除的记录的指针,因此我不知道如何称呼destuructor,以便它可以做我想要的。课程:

   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中要做的事情?

要调用destructor,语法为 current->~rec(),但是在几乎情况下,您不应在C 中直接调用distuructor。通过调用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类的逻辑很好地隔离。