在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/

10-09 03:14