从朋友班上调用灾难
calling the destructor from a friend class
我正在使用朋友类,当我从列表类调用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
内存时导致双重损坏。
建议:避免使用朋友类,在您的情况下,next
和prev
成员与list
有关,而不是rec
类。因此,您的list
课程可能会有一个嵌套的装饰班,可以包装您的rec
类,例如:
class list
{
struct item {
rec* value;
rec* prev;
rec* next;
};
item * first;
item * last;
public:
// ...
};
然后,您的列表的逻辑将与rec
类的逻辑很好地隔离。
相关文章:
- 什么时候调用组成单元对象的析构函数
- 对RValue对象调用的LValue ref限定成员函数
- 为什么使用 "this" 指针调用派生成员函数?
- 函数调用中参数的顺序重要吗
- OpenGL - 在抛出"__gnu_cxx::recursive_init_error"实例后终止调用?
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 在c++类上调用void函数
- 为什么 std::unique 不调用 std::sort?
- 调用专用模板时出错"no matching function for call to [...]"
- 选择要调用的构造函数
- C++为什么尽管我调用了void函数,它却不起作用
- 构造函数正在调用一个使用当前类类型的函数
- 变量没有改变?通过向量的函数调用
- 没有为自己的结构调用列表推回方法
- 调用'begin(int [n])'没有匹配函数
- 什么时候调用析构函数
- 从朋友班上调用灾难
- 朋友调用虚拟私有方法-应该发生什么
- 你能像调用成员函数一样调用朋友函数吗?