programming in c
play

PROGRAMMING IN C CSCI 5448 Pritha Srivastava Fall 2012 - PowerPoint PPT Presentation

OBJECT-ORIENTED PROGRAMMING IN C CSCI 5448 Pritha Srivastava Fall 2012 Introduction Goal : To discover how ANSI C can be used to write object- oriented code To revisit the basic concepts in OO like Information Hiding,


  1. OBJECT-ORIENTED PROGRAMMING IN C CSCI 5448 Pritha Srivastava Fall 2012

  2. Introduction  Goal :  To discover how ANSI – C can be used to write object- oriented code  To revisit the basic concepts in OO like Information Hiding, Polymorphism, Inheritance etc…  Pre-requisites – A good knowledge of pointers, structures and function pointers

  3. Table of Contents  Information Hiding  Dynamic Linkage & Polymorphism  Visibility & Access Functions  Inheritance  Multiple Inheritance  Conclusion

  4. Information Hiding  Data types - a set of values and operations to work on them  OO design paradigm states – conceal internal representation of data, expose only operations that can be used to manipulate them  Representation of data should be known only to implementer, not to user – the answer is Abstract Data Types

  5. Information Hiding  Make a header file only available to user, containing  a descriptor pointer (which represents the user-defined data type)  functions which are operations that can be performed on the data type  Functions accept and return generic ( void ) pointers which aid in hiding the implementation details

  6. Information Hiding Set.h  Example: Set of elements Type Descriptor  operations – add, find extern const void * Set; and drop .  Define a header file void* add(void *set, const void Set.h (exposed to user) *element);  Appropriate void* find(const void *set, const Abstractions – Header void *element); file name, function name void* drop(void *set, const void reveal their purpose *element); int contains(const void *set, const  Return type - void* helps void *element); in hiding implementation details Main.c - Usage Set.c

  7. Information Hiding  Set.c – Contains void* add (void *_set, void *_element) { implementation details of struct Set *set = _set; Set data type (Not struct Object *element = _element; exposed to user) if ( !element-> in)  The pointer Set (in Set.h) is { element->in = set; passed as an argument to } add, find etc. else Set.c assert(element->in == set); struct Set { unsigned count; }; ++set->count; ++element->count; static const size_t _Set = sizeof(struct Set); return element; } const void * Set = & _Set; find(), drop(), contains() etc … Externed in Set.h Main.c - Usage Set.h

  8. Information Hiding  Set is a pointer, NOT a New.h Takes in pointer ‘Set’ data type  Need to define a void* new (const void* type, …); mechanism using which void delete (void *item); Arguments variables of type Set can with which to be declared initialize the  Define a header file – variable New.h  new – creates variable conforming to descriptor Set  delete – recycles variable created Main.c - Usage New.c

  9. Information Hiding  New.c – Contains void* new (const void * type, ...) implementations for { new() and delete() const size_t size = * (const size_t *) type; void * p = calloc(1, size); assert(p); return p; } d elete() … Main.c - Usage New.h

  10. Information Hiding  Need another data Object.h Type Descriptor type to represent an Object that will be extern const void *Object; added to a Set  Define a header file Compares variables of type ‘Object’ – Object.h int differ(const void *a, const void *b); Object.c Main.c - Usage

  11. Information Hiding  Object.c – struct Object { unsigned count; struct Set * in; }; Contains implementation static const size_t _Object = sizeof(struct details of Object Object); data type (Not const void * Object = & _Object; exposed to user) Externed in Object.h int differ (const void * a, const void * b) { return a != b; } Object.h Main.c - Usage

  12. Information Hiding  Application to demonstrate void *b = add(s, new(Object)); the usage of Set.h, void *c = new(Object); Object.h & New.h Pointer ‘Object’ externed in Object.h #include <stdio.h> #include “New.h” if(contains(s, a) && contains(s,b)) Only header files #include “Set.h” puts(“OK”); given to user #include “Object.h” delete(drop(s, b)); int main() delete(drop(s, a)); Pointer ‘Set’ externed in Set.h { } void *s = new (Set); void *a = add(s, new(Object); Output: OK New.c Set.h Set.c Object.h Object.c New.h

  13. Dynamic Linkage & Polymorphism  A generic function should be able to invoke type- specific functions using the pointer to the object  Demonstrate with an example how function pointers can be used to achieve this  Introduce how constructors , destructors and other such generic functions can be defined and invoked dynamically

  14. Dynamic Linkage & Polymorphism  Problem:  Implement a String data type to be included/ added to a Set  Requires a dynamic buffer to hold data  Possible Solution:  new() – can include memory allocation; but will have a chain of ‘if’ statements to support memory allocations and initializations specific to each data-type  Similar problems with delete() for reclamation of memory allocated

  15. Dynamic Linkage & Polymorphism  Elegant Solution:  Each object must be responsible for initializing and deleting its own resources (constructor & destructor)  new() – responsible for allocating memory for struct String & constructor responsible for allocating memory for the text buffer within struct String and other type-specific initializations  delete() – responsible for freeing up memory allocated for struct String & destructor responsible for freeing up memory allocated for text buffer within struct String

  16. Dynamic Linkage & Polymorphism struct Class {  How to Locate the /* Size of the object */ constructor & destructor size_t size; within new() & delete() ? /* Constructor */  Define a table of function void * (* ctor) (void * self, va_list * app); pointers which can be /* Destructor */ common for each data- void * (* dtor) (void * self); type /* Makes a copy of the object self */  Associate this table with void * (* clone) (const void * self); the data-type itself /* Compares two objects */  Example of table – Struct int (* differ) (const void * self, const void * b); Class };

  17. Dynamic Linkage & Polymorphism  struct Class has to be struct String { made a part of the const void * class; /* must be first */ data - type char * text;  pointer to struct Class is }; there in the data - type struct Set { String and Set const void * class; /* must be first */ ... };

  18. Dynamic Linkage & Polymorphism  struct Class pointer at the void * new (const void * _class, ...) Allocate beginning of each Object is memory for p { of size important, so that it can be used const struct Class * class = _class; given in _class to locate the dynamically linked void * p = calloc(1, class — > size); function (constructor & destructor) * (const struct Class **) p = class; as shown if (class — > ctor)  new() & delete() can be used to Assign class at { the beginning allocate memory for any data- va_list ap; of the new type variable p va_start(ap, _class); void delete (void * self) p = class — > ctor(p, & ap); { va_end(ap); Locate and const struct Class ** cp = self; invoke the } if (self && * cp && (* cp) — > dtor) dynamically return p; linked self = (* cp) — > dtor(self); constructor } free(self); }

  19. Dynamic Linkage & Polymorphism int differ (const void * self, const void * b) size_t sizeOf (const void * self) { { const struct Class * const * cp = self; const struct Class * const * cp = self; assert(self && * cp && (* cp) — >differ); assert(self && * cp); Dynamica Variable which return (* cp) — > differ(self, b); return (* cp) — > size; lly linked stores size in } function } struct Class  Polymorphism : differ() is a  Dynamic Linkage/ Late Binding : the function that does the actual generic function which takes in work is called only during execution arguments of any type (void  Static Linkage: Demonstrated by *), and invokes the sizeOf(). It can take in any object as appropriate dynamically argument and return its size which is linked function based on the stored as a variable in the pointer type of the object of type struct Class

  20. Dynamic Linkage & Polymorphism  Define a header file String.h String.h which defines the abstract data extern const void * String; type- String:

  21. Dynamic Linkage & Polymorphism  Define another header String.r file String.r which is the representation file for struct String { String data-type /* must be first */ const void * class; char * text; };

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend