यदि आप सी में निजी चर चाहते हैं, तो ऐसी कई तकनीकें हैं जो एक निजी चर का अनुमान लगा सकती हैं, लेकिन सी भाषा में वास्तव में "सुरक्षा" अवधारणा नहीं है जो निजी, सार्वजनिक, संरक्षित (सी ++ कर देता है)।
सी किसी भी चर (यह सी में यह आवश्यक हैं) की नाम दिखाई देंगे ताकि आप प्रकार चर की (निर्माण काफी मुश्किल अपसंदर्भन) छुपा जानकारी के विचार के साथ यह दृष्टिकोण होना चाहिए। करने के लिए परिभाषित वास्तविक चर प्रकार वाला 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".
एक बेहतर तरीका की तरह तो कई वेरिएंट है
/* 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;
}
तकनीक इस तरह struct
कीवर्ड का उपयोग इस विचार का विस्तार, और छद्म तरीकों बनाने के लिए, किसी व्यक्ति के लिए एक "सार्वजनिक struct है "एक निजी * सूचक" निजी संरचना "के साथ सूचक। एक "सार्वजनिक संरचना" (पॉलिमॉर्फिज्म का समर्थन करने के लिए एक कदम) में फ़ंक्शन पॉइंटर्स के रूप में "विधियों" को शामिल करना है, वास्तव में एक पूर्ण और उचित सी ++ प्रकार प्रणाली लिखना है जो सी ++ के रूप में चीजों को हल करने का प्रयास करता है (कक्षा पदानुक्रम, polymorphisim, देर से बाध्यकारी, सूचना छिपाने, आदि)।
मूल रूप से, आप प्राप्त कर सकते हैं कुछ "वस्तु उन्मुख सत्ता" बहुत ज्यादा काम के बिना, लेकिन आप -ornamentation के और अधिक सुविधाओं को जोड़ने के रूप में, आप और अधिक गोंद कोड जोड़ देगा (जब तक यह है बहुत सरल वास्तव में एक का उपयोग करने के ऑब्जेक्ट उन्मुख प्रोग्रामिंग भाषा)।
'सी' में' निजी' की धारणा नहीं है। शायद 'स्थिर' वैश्विक चर को देखने की कोशिश कर रहा है। – RageD
इस प्रकार मेरा प्रश्न। मैं सी कैसे चाल सकता हूँ? – Reid
यह इस बात पर निर्भर करता है कि आप क्या करने की कोशिश कर रहे हैं। चूंकि 'सी 'ओओपी नहीं है (यह कार्य उन्मुख है) आपको कार्यों और' संरचना 'या वैश्विक चर के साथ काम करना होगा। – RageD