如何删除在以下结构中具有成员函数的c编程中的结构?
How to delete a struct in c programming which has member functions in the following struct?
我能够创建下面的所有函数并执行所有操作,但是我无法删除这棵树,所以请有人帮助我如何删除这种类型的结构
typedef struct Tree
{
Node *root;
Data *(*insert)(struct Tree *, Data);
Data *(*search)(struct Tree *bst, Data value);
void (*sort)(struct Tree *, Data *);
int (*compare)(struct Tree *t, struct Tree *copy);
struct Tree * (*clone)(struct Tree *t);
void (*delete)(struct Tree * bst);
void (*removeData)(struct Tree * bst, Data value);
}Tree;
树实例如下
Tree *newTree()
{
Tree *bsttemp = (Tree *)malloc(sizeof(Tree));
bsttemp->root = NULL;
bsttemp->insert = &insert;
bsttemp->search = &search;
bsttemp->sort = &sort;
bsttemp->compare = &compare;
bsttemp->clone = &clone;
// bsttemp->delete = &delete;
bsttemp->removeData = &removeData;
return bsttemp;
}
看起来你试图在 C 中模拟 类....
总之,
Tree *bsttemp = (Tree *)malloc(sizeof(Tree));
无论谁获得 bsttemp 指针(newTree() 函数的调用者)都可以简单地对该指针调用 free()。
顺便说一句,不要强制转换 malloc()。它是不必要的,可以隐藏 C99 之前版本的 C 中的错误。
至少将函数放在 C 结构中是不常见的。由于 C 不会自动传递 this
指针,因此您必须使用
struct Tree *tree;
...
struct Tree *tree2 = tree->clone(tree); // same as directly calling: clone(tree)
它通常只用于实现虚拟函数,意思是这里的函数可以依赖于对象,这是非常不常见的用例 - 它通常依赖于一组对象,因此该对象只有一个指向 vTable 的指针,它是一种函数数组。
在C语言中的规则是:先销毁成员,然后释放对象,所以这里的if可能或多或少
void delete(Tree &tree) {
// destroy and free descendants of root
...
// destroy and free root
...
free(tree);
}
我能够创建下面的所有函数并执行所有操作,但是我无法删除这棵树,所以请有人帮助我如何删除这种类型的结构
typedef struct Tree
{
Node *root;
Data *(*insert)(struct Tree *, Data);
Data *(*search)(struct Tree *bst, Data value);
void (*sort)(struct Tree *, Data *);
int (*compare)(struct Tree *t, struct Tree *copy);
struct Tree * (*clone)(struct Tree *t);
void (*delete)(struct Tree * bst);
void (*removeData)(struct Tree * bst, Data value);
}Tree;
树实例如下
Tree *newTree()
{
Tree *bsttemp = (Tree *)malloc(sizeof(Tree));
bsttemp->root = NULL;
bsttemp->insert = &insert;
bsttemp->search = &search;
bsttemp->sort = &sort;
bsttemp->compare = &compare;
bsttemp->clone = &clone;
// bsttemp->delete = &delete;
bsttemp->removeData = &removeData;
return bsttemp;
}
看起来你试图在 C 中模拟 类....
总之,
Tree *bsttemp = (Tree *)malloc(sizeof(Tree));
无论谁获得 bsttemp 指针(newTree() 函数的调用者)都可以简单地对该指针调用 free()。
顺便说一句,不要强制转换 malloc()。它是不必要的,可以隐藏 C99 之前版本的 C 中的错误。
至少将函数放在 C 结构中是不常见的。由于 C 不会自动传递 this
指针,因此您必须使用
struct Tree *tree;
...
struct Tree *tree2 = tree->clone(tree); // same as directly calling: clone(tree)
它通常只用于实现虚拟函数,意思是这里的函数可以依赖于对象,这是非常不常见的用例 - 它通常依赖于一组对象,因此该对象只有一个指向 vTable 的指针,它是一种函数数组。
在C语言中的规则是:先销毁成员,然后释放对象,所以这里的if可能或多或少
void delete(Tree &tree) {
// destroy and free descendants of root
...
// destroy and free root
...
free(tree);
}