Objektorientier programmieren in C?

Razorhawk

Webdesigner und MSP
Ich habe gerade mal den Stack erweitert, dass man ihn auch in mehrfacher Ausführung in einem Programm neu instanzieren kann.
...
Mir kommt so der Gedanke dabei, kann es sein, dass ich hier dann praktisch objektorientiert arbeite ohne ein objektorientierte Sprache zu haben?


header datei stack.h
Code:
#ifndef STACK_H
#define STACK_H


/* Hier sollte noch was kommen... - ja nämlich ein Typedef um sich struct sparen zu können... dummes Geschreibsel! ;-) */
typedef struct stack stack;

/* Liefert einen Pointer auf einen neuen Stack. */
extern stack* newStack();

/* Legt den Wert <code>i</code> auf den Stack <code>s</code>. */
extern void push(stack* s, int i);

/* Gibt den obersten Wert des Stacks <code>s</code> zurueck,
 * ohne ihn vom Stack zu loeschen. */
extern int top(stack* s);

/* Gibt den obersten Wert des Stacks <code>s</code> zurueck
 * und loescht ihn vom Stack. */
extern int pop(stack* s);

/* Liefert als Ergebnis einen Wert der besagt, ob der Stack leer ist.
 * 0 => Stack ist nicht leer; 1 => Stack enthaelt keine Werte */
extern int isEmpty(stack* s);

/* Gibt den Stack top->down aus. */
extern void printStack(stack* s);

#endif



stack.c
Code:
#include <stdio.h>
#include <stdlib.h>

#include "stack.h"



// struktur wird definiert für eine Liste mit next-pointer und inhaltsvariable
struct stacklist{
       
       int string;
       struct stacklist *next;
            
};


// vorbereiten um ein Stack als Objekt erzeugen zu können -> ermöglicht mehrere Stacks in einem Programm zu verwalten
struct stack{
  
      struct stacklist *top;
       
};


// Stack wird erstellt
stack* newStack(){
 
 // Speicher allocieren
 stack *temp = (stack *)malloc(sizeof(stack));
 
 // oberstes Element NULL (leer setzen)
 temp->top = NULL;
 
 return temp;
       
       
}


// Element i auf den Stack legen
void push(stack* s, int i){
 
 // speicher für neues Stack element allocieren
 struct stacklist *temp = (struct stacklist *)malloc(sizeof(struct stacklist));
 
 // i dem Stack zuweisen
 temp->string = i;
 // Pointer der neuen Elements auf die alte Liste zeigen lassen
 temp->next = s->top;
 
 // Temp-Stack dem Stack-Objekt zuweisen
 s->top = temp;
     
}



int top(stack *s){
    
    // Rückgabe des obersten Elementes ohne entfernen dieses Element vom Stack
    return s->top->string;

}

int pop(stack *s){
   
   
 struct stacklist *temp;   
 // Rückgabewert Standard auf null 0 = keine Rückgabe möglich
 //  VORSICHT  fehleranfällig falls Nullen im Stack enthalten sind, ist aber nicht naders möglich bei Int Werten.
 int popdata=0;
 
 // Falls der Stack nicht leer ist   
 if (s->top!= NULL){
     
   // Rückgabewert wird oberstes Stackelement zugewiesen          
   popdata = s->top->string;
   // anhängen der Liste ohne oberstes Element an temp
   temp = s->top;
   kürzere Liste dem Stackobjekt zuweisen
   s->top = s->top->next;
   
   // Speicherfreigabe des obersten Stackelements da sonst Adresse gesperrt für das gesammte Programm!
   free(temp);
              
 } 
 
 return popdata;
    
}

int isEmpty(stack *s){
   
 // wenn Stack leer dann 1 (= ja ist leer) sonst 0 (= nein ist nicht leer)   
 if(s->top == NULL){
 
   return 1;
           
 }else{
       
   return 0;    
       
 }
 
    
}

void stackPrint(stack *s){
     
 // Stack wird mit pop() solange ausgegeben bis er leer ist
 // andere Möglichkeit wäre den Stack auszugeben ohne ihn zu leeren
 // ist aber in der Aufgabe nicht erwähnt auf welche weise!    
 while(!isEmpty(s)){
                   
   printf("%i\n", pop(s));
 
 }
     
}
 
Naja ich dachte das müsste bei jedem Gleich sein, da es definiert ist ;)
Aber wenn du mich locken willst, dann meine ich damit

Naja also im allgemeinen bedeutet dass man neue Objekte und und damit auch beliebig viele Instanzen erstellen kann von einem Objekt.
Nehmen wir mal an ich würde mit Hilfe einer so geschriebenen Liste ein Telefonbuch schreiben, dann könnte ich doch mit dieser technik mir in einem Programm beliebig viele Telefonbücher erstellen!

Zudem habe ich ja halt durch die Instanzen lokale Variablen zu diesem Objekt und ebenfalls Operationen die diesen ändern können.

Das ist im allgemeinen doch objektorientiertes programmieren.

Als Beispiel wäre da nochmal das klassische beispiel:

Auto.mercedes.farbe.silber
Auto.mercedes.farbe.schwarz
Auto.bmw.farbe.schwarz usw.....
 
moin


Naja ich dachte das müsste bei jedem Gleich sein, da es definiert ist ;)
Hihi, du würdest dich wundern was ich da schon für Antworten gehört hab :)

Oop ist allerdings noch einiges mehr als mit Instanzen zu arbeiten...


mfg
umbrasaxum
 
Oop ist allerdings noch einiges mehr als mit Instanzen zu arbeiten...
...Allerdings

Versuch doch mal Beschreibungen von deinen Objekten abzuleiten, da scheitert es schon bei deinem Objektmodel.
Das Ganze was Klassen können fehlt bei C komplett.
Du kannst auch keine Interface-Logik verwenden und dadurch auch keine Polymorphie.
Objektorientiert heisst auch ganz einfach, ich definiere abstrakte oder konkrete beschreibungen von "Dingen" und diese werden dann instanziert.
Dafür ist C einfach nicht gedacht denn dafür gibt es ja C++

Gruß Daniel
 
Hi.

Ja, im Prinzip kannst du das so betrachten, das du da ein (bzw. mehrere) Objekt(e) hast und spezielle Funktionen (Konstruktoren) die solche Objekte erstellen und spezielle "Member" Funktionen die Operationen auf diesen Objekten ausführen.

Wie bereits geschrieben wurde fehlen noch ein paar nicht ganz unerhebliche Eigenschaften bis man wirklich von objektorientiert sprechen kann.

Allerdings kann man bis zu einem gewissen Grad (inklusive Vererbung und virtuellen Funktionen) auch in C objektorientiert programmieren - nur muß man dann die fehlenden Sprachmittel durch geeignete Definitionen und Makros ersetzen. Schließlich war die Vor-Version von C++ auch nur eine Ansammlung von Makros in C und hieß "C with classes".

Für ein gutes Beispiel für objektorientiertes Programmieren in C kannst du dir ja mal das Gtk+ Toolkit ansehen (http://developer.gnome.org/doc/GGAD/cha-objects.html).

Gruß
 
Zurück