在C语言中尝试原始的面向对象思想。
主要c:
#include <stdio.h>
#include <stdlib.h>
#include "reptile.h"
int main()
{
const char *name = "Spot";
turtle_t *t = maketurtle(name);
t->hide(t); // <---- "Error: dereferencing pointer to incomplete type"
return 0;
}
爬行动物。h:
#ifndef REPTILE_H
#define REPTILE_H
typedef struct turtle_t turtle_t;
turtle_t* maketurtle(const char *name);
void hide(turtle_t *self);
#endif // REPTILE_H
爬行动物c:
#include <stdio.h>
#include <stdlib.h>
#include "reptile.h"
typedef struct turtle_t
{
int numoflegs;
const char name[25];
void (*hide)(turtle_t *self);
} turtle_t;
turtle_t* maketurtle(const char *name)
{
turtle_t *t = (turtle_t*)malloc(sizeof(turtle_t));
t->name = name;
return t;
}
void hide(turtle_t *self)
{
printf("The turtle %s has withdrawn into his shell!", self->name);
}
我有什么遗漏吗?我在这里看到过一个类似的堆栈溢出情况,我的代码看起来至少在结构上是相同的,所以我有点困惑。提前谢谢!
如果这是一个链接器错误,我如何让它在IDE中编译而不抛出错误?
最佳答案
当编译器在main.c
文件上工作时,它知道有一个名为turtle_t
的结构,但它对此一无所知,它没有完全定义。
你需要让结构“公开”,或者至少是应该公开的部分。这可以通过使用两个结构来轻松完成,一个用于公共“方法”和成员变量,另一个包含私有数据的嵌套结构。有点像
typedef struct turtle_private_t turtle_private_t;
typedef struct turtle_t turtle_t;
struct turtle_t
{
turtle_private_t *private; // For private data
void (*hide)(turtle_t *self);
};
另一种方法,也是一种常见的方法,是不在结构中放置公共函数,而是使用普通函数,在它们的名称前加一个特殊的前缀来表示类。有点像
turtle_t *turtle_create(void); // Creates the turtle
void turtle_hide(turtle_t *); // Hides the turtle
关于c - C语言中的基本OOP,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32816566/