C++ Programmierer sucht Klassen in C



  • Gibt es in C eigentlich so etwas wie Klassen? ­čśĽ
    Und wenn ja, wie schreibt man sie?
    Auf keinen Fall so:

    class Klasse
    

    Denn da sagt GCC, er hat ein =, ;, asm oder __attribute__ erwartet.



  • In C gibt es structures. Ist aber nicht das gleiche wie Klassen.

    Kannst hier ja mal nachlesen: http://publications.gbdirect.co.uk/c_book/chapter6/structures.html


  • Mod

    Und du kannst ├╝brigens auch objektorientiert arbeiten in C, obwohl die structs keine Methoden kennen. Da baust du dir dann eben freie Funktionen, also statt wie in C++

    class foo
    {
     void bar()
     {
      // ...
     }
    };
    
    typedef struct foo
    {
    } foo;
    
    void bar(foo *this)
    {
     // ...
    }
    

    Und den Rest kannst du dir sicherlich denken.

    Wobei die Verantwortlichkeit f├╝r die Einhaltung der Objektorientierung nun aber bei dir als Programmierer liegt. C kennt kein private und ├Ąhnliches, da musst du dich selber zu zwingen, diese M├Âglichkeiten nicht zu missbrauchen.



  • Vielen Dank. Ich habe es ├╝berflogen, und ich glaube, es hilft mir.
    Wenn nicht, melde ich mich erneut.



  • Hier mal eine einfache Variante f├╝r Quasi-Klassen in C (Betonung liegt auf Quasi f├╝r alle Querulanten):

    /* "Basisklasse" mit gemeinsamen Eigenschaften aller Unterklassen */
    typedef struct {
      void(*ausgabe)(void*);
      int z, ergebnis;
    } BasisBerechner;
    
    /* "Unterklasse" mit jeweiliger unterschiedlicher Implementierung */
    typedef struct {
      BasisBerechner basis;
      void (*run)(void*,int);
    } Berechner;
    
    static void ausgabe(BasisBerechner *this)
    {
      printf("%d : %d\n",this->z,this->ergebnis);
    }
    
    static void plus(Berechner *this,int x)
    {
      this->basis.z++;
      this->basis.ergebnis+=x;
    }
    
    static void minus(Berechner *this,int x)
    {
      this->basis.z++;
      this->basis.ergebnis-=x;
    }
    
    #define CALLP(objekt,methode,p) objekt.methode(&objekt,p)
    #define CALL(objekt,methode)   objekt.methode(&objekt)
    
    int main()
    {
      BasisBerechner bb={ausgabe}; /* Instanziierung einer "Basisklasse", in klassischer OOP nat├╝rlich widersinnig */
      Berechner plusb={bb,plus},minusb={bb,minus}; /* Instanziierung zweier "Unterklassen" */
    
      CALLP(plusb,run,1);
      CALLP(plusb,run,2);
      CALLP(plusb,run,3);
      CALLP(minusb,run,1);
      CALLP(minusb,run,2);
      CALLP(minusb,run,3);
    
      CALL(plusb,basis.ausgabe);
      CALL(minusb,basis.ausgabe);
    
      return 0;
    }
    

    Und f├╝r einen Vergleich mal eine C++ Variante:

    using namespace std;
    
    class BasisBerechner {
    public:
      BasisBerechner() : z(0),ergebnis(0){}
      void ausgabe(){cout << z << " : " << ergebnis << endl;}
      int z, ergebnis;
    };
    
    class BerechnerPlus : public BasisBerechner {
    public:
      void run(int i){++z;ergebnis+=i;}
    };
    
    class BerechnerMinus : public BasisBerechner {
    public:
      void run(int i){++z;ergebnis-=i;}
    };
    
    int main()
    {
      BerechnerPlus plusb;
      BerechnerMinus minusb;
    
      plusb.run(1);
      plusb.run(2);
      plusb.run(3);
      minusb.run(1);
      minusb.run(2);
      minusb.run(3);
    
      plusb.ausgabe();
      minusb.ausgabe();
    }
    

    Man sieht f├╝r einfache Aufgabenstellungen geht sowas ohne Mehrcodierung in Gr├Â├čenordnungen.


Log in to reply