所以,如果有'有趣',我決定使用指針函數在C
中模擬C++
成員函數。下面是一個簡單的代碼:使用指針函數來模仿C結構中的成員函數
obj.h:
#ifndef OBJ_H
#define OBJ_H
#include <stdlib.h>
#include <stdio.h>
struct Obj{
struct pObjVar* pVar;
void (*read)(struct Obj*);
void (*set) (struct Obj*, int);
};
struct Obj* newObj();
void deleteObj(struct Obj** obj);
#endif
obj.c:
main.c中:
#include "obj.h"
int main(void)
{
struct Obj* a = newObj();
a->set(a, 10);
a->read(a);
deleteObj(&a);
return 0;
}
輸出:
>./a.out
Value = 10
然而,在這樣做的時候,我想我必須通過明確地將它傳遞給我的成員函數來仿效隱式指針this
的作用。我猜,這工作正常,除了它使整個事情看起來很奇怪!
如果我想傳遞對象,爲什麼要實現函數作爲成員函數?我發現它的唯一答案可能是你想要一個統一的界面,但各種實現? (類似到C++
虛擬函數?)
什麼是(如果有)某些其他原因來模仿成員函數?此外,有沒有辦法避免通過顯式的this_
指針呢?
編輯:傳遞對象時原始代碼存在問題。我錯誤地將&a
用於read/set
函數。如果您想要在內部將指針設置爲NULL
,則只需要deleteObj
。
您正在傳遞指向函數的_address_,即'Obj **'。跳過函數調用中的&&。 – 2012-03-20 10:26:04
@JoachimPileborg:你是對的。請參閱我的編輯 – GradGuy 2012-03-20 10:38:05
我曾經不得不使用類似的方法維護一個遺留項目,具有複雜的繼承層次,並且使用不透明的typedef'ed int值而不是指向結構的指針。不用說,調試/維護是一場噩夢! – SirDarius 2012-03-20 10:44:21