如果你想在c中使用私有變量,有許多技術可以接近一個私有變量,但是C語言實際上沒有一個擴展到private,public,protected的「保護」概念(如C++一樣)。
C的溫度將顯示任何變量(這是一個在C要求)的名所以你必須與信息隱藏類型的變量(決策提領相當困難的)想法接近它。
一個竅門是限定的變量作爲void*
與實際變量的類型僅在一個.c
模塊是已知的。
/* somefile.h */
extern void* counter;
/* somefile.c */
#include "somefile.h"
int actualCounter = 0;
void* counter = &actualCounter;
/* otherfile.c */
#include "somefile.h"
// we can see "counter", but we cannot "use" it here; because we don't have access
// to the real "hidden" type of "int".
更好的方法是使用struct
關鍵字來擴展這一理念,使僞方法,像這樣
/* person.h */
struct s_person;
typedef Person struct s_person;
Person* new_Person(char* name);
void delete_Person(Person* person);
void Person_setName(Person* person, char* name);
char* Person_getName(Person* person);
/* person.c */
struct s_person {
char* name;
};
Person* new_Person(char* name) {
Person* object = (Person*)malloc(sizeof(struct s_person));
// duplicate the string for more security, otherwise constructor
// could manipulate the "private" string after construction.
object->name = strdup(name);
return object;
}
void delete_Person(Person* person) {
// some implementations pass a Person** to set the reference to 0
// this implementation requires that the caller sets his own references to 0
free(person->name);
free(person);
}
void Person_setName(Person* person, char* name) {
// free the old
free(person->name);
// duplicate the new to provide "out of simulated class" modification by malicious
// name setter.
person->name = strdup(name);
}
char* Person_getName(Person* person) {
// must return a copy, otherwise one can manipulate name
// from reference provided by Person_getName(...);
return strdup(person->name);
}
/* otherfile.c */
#include "Person.h"
/* Now we can hold Person "simulated objects", but we cannot */
/* manipulate their "state" without using the C simulated object */
/* methods */
int main(int argc, char** argv) {
Person* bob = new_Person("bob");
printf("%s\n", Person_getName(bob));
delete_Person(bob);
// critical or we hold a pointer to freed memory.
bob = 0;
return 0;
}
說這樣的方法有幾個變種,一個是有一個「公共結構「帶有指向」私有結構「的void *指針。一種是將「方法」作爲函數指針包含在「公共結構」(支持多態的一個步驟)中,一種是實際編寫一個完整且正確的C++類型系統,試圖按照C++的原則來解析事物(類層次結構,多態性,後期綁定,信息隱藏等)。基本上,你可以在沒有太多工作的情況下獲得一些「面向對象的內核」,但是當你添加更多的-ornamentation特性時,你將會添加更多的膠水代碼(直到它是實際上更容易使用面向對象的編程語言)。
'C'沒有'private'的概念。也許試着看'靜態'全局變量。 – RageD 2012-04-25 16:40:40
因此我的問題。我如何欺騙C? – Reid 2012-04-25 16:41:18
這取決於你想要做什麼。由於'C'不是OOP(它是面向函數的),你將不得不使用函數和'結構'或全局變量。 – RageD 2012-04-25 16:43:34