migf1 Δημοσ. 1 Δεκεμβρίου 2011 Δημοσ. 1 Δεκεμβρίου 2011 Γνωρίζει κανείς αν & πως μπορεί να προσομοιωθεί ενσωματωμένος constructor ή (initializer) μιας προσομοιωμένης κλάσης μέσα της, σε ANSI C; Π.χ... > typedef struct Class Class; struct Class { /* data */ char name[ NAMESIZE ]; int age; /* methods */ /*** ---> Bool (*init)( Class *this ); <--- ***/ /*** ---> Class *(*new)( void ); <--- ***/ void (*destroy)( Class *this ); struct SetMethods { Bool (*name)( Class *this, char *name ); Bool (*age)( Class *this, int age ); /* bla bla */ } set; struct GetMethods { char *(*name)( const Class *this ); int (*age)( const Class *this); /* bla bla */ } get; }; init() για στατικά objects: Class object; ... new() για δυναμικά: Class *object;
godlike Δημοσ. 1 Δεκεμβρίου 2011 Δημοσ. 1 Δεκεμβρίου 2011 Προσπαθείς να κάνεις emulate το object oriented programming της C++ στην C; To ΟΟ της C++ δεν δουλεύει ακριβώς έτσι. Δλδ δεν έχεις για κάθε method και έναν pointer σε function. Κάπως έτσι θα ήταν ο optimized τρόπος: >typedef struct Class { char name[NAMESIZE]; int age; } Class; char* Class_getName(Class* this) { return this->name; } void Class_setName(Class* this, const char* n) { strcpy(this->name, n); } Τώρα για την ερώτησή σου, με κάθε επιφύλαξη, δεν γίνεται να εκτελείτε αυτόματα κάποια function κατά το construction. Στην C πρέπει να τα κάνεις όλα με το χεράκι. Επαναλαμβάνω με κάθε επιφύλαξη
migf1 Δημοσ. 1 Δεκεμβρίου 2011 Μέλος Δημοσ. 1 Δεκεμβρίου 2011 Thanks για την απάντηση! Δεν προσπαθώ να προσομοιώσω το OOP της C++, απλά OOP γενικώς. Το 'χω δουλέψει όταν ήμουν στην ενεργό δράση, αλλά δεν είχαμε ενσωματωμένο constructor. Αναρωτήθηκα λοιπόν μήπως υπάρχει κάνα τρικ που δεν το γνωρίζω. Mε τη δική μου προσέγγιση, με ορισμό κλάσης... > typedef struct Class Class; struct Class { /* data */ char name[ NAMESIZE ]; int age, height, weight; /* methods */ Bool (*init)( Class *this ); void (*destroy)( Class *this ); struct SetMethods { Bool (*name)( Class *this, char *name ); Bool (*age)( Class *this, int age ); Bool (*both)( Class *this, char *name, int age ); } set; struct GetMethods { char *(*name)( const Class *this ); int (*age)( const Class *this); /* bla bla */ } get; struct PrintMethods { Bool (*name)( const Class *this ); Bool (*age)( const Class *this ); Bool (*summary)( const Class *this ); } print; }; και εξωτερικό constructor (+ initializer)... > Class *class_newObject( void ) { Class *this = malloc( sizeof( Class ) ); if ( this ) { /* data */ if ( this->name ) { memset( this->name, '\0', NAMESIZE ); strncpy( this->name, "-- empty --", NAMESIZE-1 ); } this->age = 20; /* methods */ this->init = &class_init; this->destroy = &class_destroy; this->set.name = &class_set_name; this->set.age = &class_set_age; this->set.both = &class_set_both; this->get.name = &class_get_name; this->get.age = &class_get_age; this->print.name = &class_print_name; this->print.age = &class_print_age; this->print.summary = &class_print_summary; } return this; } μπορείς να γράφεις κώδικα σαν αυτόν... > int main( void ) { Class *object = class_newObject(); object->print.summary( object ); object->set.both( object, "Harry", 30 ); object->print.summary( object ); object->init( object ); object->print.summary( object ); object->destroy( object ); return 0; }
παπι Δημοσ. 1 Δεκεμβρίου 2011 Δημοσ. 1 Δεκεμβρίου 2011 Το πιο απλο ειναι να παιζεις με perfix struct object{...}; object_Constructor(object*); object_Foo(object*); object_Bar(object*); Αυτο κανει και η c++ (εκτος απο το vft) Αντε να καλεις τον constructor με defines πχ >#define Object(Type,Name)\ Type Name;\ Type* Name##ptr = &Name;\ Type##Ctl(Name##ptr); με την προυποθεση οτι ο constructor θα εχει ονομα TypeCtl
migf1 Δημοσ. 1 Δεκεμβρίου 2011 Μέλος Δημοσ. 1 Δεκεμβρίου 2011 Όντως αυτό είναι το πιο απλό, όπως επισήμανε κι ο φίλος godlike, είναι όμως ταυτόχρονα και το λιγότερο δομημένο και το λιγότερο ευέλικτο (σκέψου π.χ. όταν θες να υλοποιήσεις πολυμορφισμό, virtual functions/classes, κλπ) Btw, έχω κάνει λαλακία στο παράδειγμα... έχω ενσωματώσει τον destructor μέσα στην κλάση
Προτεινόμενες αναρτήσεις
Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε
Πρέπει να είστε μέλος για να αφήσετε σχόλιο
Δημιουργία λογαριασμού
Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!
Δημιουργία νέου λογαριασμούΣύνδεση
Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.
Συνδεθείτε τώρα