在C.與原始OOP想法進行實驗初步OOP用C
main.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;
}
reptile.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
reptile.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);
}
有什麼我失蹤?我在堆棧溢出中看過類似的情況,我的代碼至少在結構上看起來相同,所以我有點困惑。提前致謝!
p.s.如果這是一個鏈接器錯誤,我該如何讓它在IDE中編譯而不會引發錯誤?
注意,請考慮在您的方法名稱前加上它們所屬的類型以避免潛在的命名衝突。 –
另一方面說明:你應該寫一個'name'變量的硬拷貝,不要讓指針指向字符串。也就是說,用strcpy替換't-> name = name;'。 – Lundin
第三方說明:考慮讓你的函數成爲'static'。即使你使用你的結構和指向函數的指針,實際的函數本身仍然可以是「靜態」的。這可避免在與可能包含具有相同名稱的導出函數的其他文件鏈接時發生名稱衝突。 –