我是C编程的新手,作为一个迷你项目,我决定尝试使用文件GenericStack.h中的OOP样式结构在C中实现堆栈,如下所示:
void _GENERICSTACK0001(void *,void *);
void *_GENERICSTACK0002(void *);
int _GENERICSTACK0003(void *);
typedef struct
{
struct GenericStackNode *next;
void *data;
int type;
}GenericStackNode;
typedef struct
{
struct GenericStackNode *top;
int count;
void (*add)(void *,void *);
void *(*pop)(void *);
int (*hasNext)(void *);
int (*getCount)(void *);
}GenericStack;
GenericStack newGenericStack()
{
GenericStack *genStack = malloc(sizeof(GenericStack));
genStack->add = _GENERICSTACK0001;
genStack->pop = _GENERICSTACK0002;
genStack->hasNext = _GENERICSTACK0003;
genStack->getCount = _GENERICSTACK0003;
genStack->top=NULL;
genStack->count = 0;
return *genStack;
}
void _GENERICSTACK0001(void *self,void *data)//add
{
GenericStack *genStack = self;
if(genStack->top == NULL)
{
genStack->top = malloc(sizeof(GenericStackNode));
genStack->top->next = NULL;
genStack->top->type = 0;
genStack->top->data = data;
}
else
{
GenericStackNode *temp = malloc(sizeof(GenericStackNode));
temp->next = genStack->top;
temp->type = 0;
temp->data = data;
genStack->top = temp;
genStack->count++;
}
}
void *_GENERICSTACK0002(void *self)//pop
{
GenericStack *genStack = self;
void *data = NULL;
if(genStack->top == NULL)
{
return data;
}
else
{
GenericStackNode *temp = genStack->top;
genStack->top = genStack->top->next;
data = temp->data;
free(temp);
genStack->count--;
return data;
}
}
int _GENERICSTACK0003(void *self)
{
GenericStack *genStack = self;
return genStack->count;
}
我需要知道的是为什么(和许多其他人一样)我得到了具体的错误:
GenericStack.h:41:16: error: dereferencing pointer to incomplete type
genStack->top->type = 0;
我已经检查了stackoverflow上有关“取消引用指向不完整类型的指针”的其他答案,但我似乎无法理解。
答案 0 :(得分:1)
您从GenericStack
收到错误,但GenericStack
和GenericStackNode
都有问题。
在C中,struct X
和X
是不同的类型。当你写:
struct GenericStackNode *next;
它声明了一个名为struct GenericStackNode
的类型(以及一个指向该类型的指针的成员)。此类型不完整,因为您尚未提供结构定义。
可以通过稍后提供结构定义来完成类型,但是你永远不会这样做。相反,您可以为其定义一个未命名的struct和typedef GenericStackNode
,但这对struct GenericStackNode
没有影响。
然后,struct GenericStackNode *top;
仍然使用相同的不完整类型,而不是上面定义的结构。
假设你的意思是指针指向它所包含的相同类型结构的指针,你可以将这个模式用于你的两个结构:
typedef struct X X;
struct X
{
X *ptr;
};
人们常常将typedef与struct定义结合起来,但我发现将它们分开是更清楚的。
答案 1 :(得分:0)
您已将类型定义为GenericStackNode
作为类型,不再需要struct GenericStackNode
,只需GenericStackNode
:
typedef struct
{
struct GenericStackNode *top;
...
}
应该只是
typedef struct
{
GenericStackNode *top;
...
}
另外,当你还没有定义它时,你不能使用GenericStackNode
:
typedef struct
{
struct GenericStackNode *next;
void *data;
int type;
} GenericStackNode ;
你可以写:
typedef struct GenericStackNode
{
struct GenericStackNode *next;
void *data;
int type;
} GenericStackNode ;