classes.odt

(42 KB) Pobierz

abstract class Root

              // type primary constructor:  Root_init_type

Root *Root_init_type(                            void                                           *vchild,

                                                                                                                                                                        roottype               type,

                                                                                                                                                                        void                                           *vobject,

                                                                                                                                                                        perr                                           (*object_vdestructor)(void*)) {

              /* Check parameters */

              if ((! vchild) || (! vobject) || (! object_vdestructor)) return NULL;

              /* Allocate new root object */

              Root *root = malloc(sizeof(Root));

              if (! root) return NULL;

              /* Initialize fields */

              root->this                                                                                                                = root;

              root->vobject                                                                                     = vobject;

              root->object_vdestructor              = object_vdestructor;

              root->vchild                                                                                                  = vchild;

              root->type                                                                                                                = type;

              /* Return newly created object */

              return root;

}

              // type copy constructor:  Root_copy

Root *Root_copy(Root *root_src, void *vchild_dest, void *vobject_dest) {

              if ((! root_src) || (! vchild_dest) || (! vobject_dest)) return NULL;

              /* Allocate new root object */

              Root *root_dest = malloc(sizeof(Root));

              if (! root_dest) return NULL;

              /* Initialize fields */

              root_dest->this                                                                                                                              = root_dest;

              root_dest->vobject                                                                                                     = vobject_dest;

              if (! root_src->object_vdestructor) { WARNING vdestructor is NULL in root_src; }

              root_dest->object_vdestructor                              = root_src->object_vdestructor;

              root_dest->vchild                                                                                                                  = vchild_dest;

              root_dest->type                                                                                                                              = root_src->type;

              /* Return newly created object */

              return root_dest;

}

              // First destructor: Root_destroy (destroys only root object instance)

perr Root_destroy(Root *root) {

              if (! root) throw E_INTRO_FAILED;

              /* Delete self */

              free(root);

              throw E_NO_ERROR;

}

              // Second destructor: Root_destroyAll (destroys also object)

perr Root_destroyAll(Root *root) {

              if (! root) throw E_INTRO_FAILED;

              /* Delete object */

              if ((root->object_vdestructor) && (root->vobject))

                            root->object_vdestructor(root->vobject);

              else WARNING Found NULL vdestructor pointer or NULL vobject;

              /* Delete self */

              free(root);

              throw E_NO_ERROR;

}

 

abstract class Widget

              // type primary constructor:  Widget_init_type

              Widget *Widget_init_type(              void                                                         *child,

                                                                                                                                                                                                    widgettype               type,

                                          ...

Zgłoś jeśli naruszono regulamin