Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Klassenimplementierung

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
13.12.2005, 14:52 Uhr
Blaufusstoelpel



Hallo,

ich wollte mal was zur Implementierung von Klassen fragen. Ich soll eine Liste als Klasse implementieren und hab jetzt m al ein wenig Pseudo-Code geschrieben (soll heissen, ich hab noch nicht versucht, ihn zu kompilieren). Könntet ihr euch den mal ansehen, und mir sagen, ob ich völlig auf dem Holzweg bin?


C++:
#include <iostream>

using namespace std;

class Liste
{
public:
       Liste (int leer);
       ~Liste();
       int ausgabe;
       struct find;
       struct loesche;
       struct einfügen;
private:
        struct element;
}

Liste::element()
//ein einzelnes Listenelement
{
element *next;
int wert;
}
Liste::Liste(int leer)
//erstelle eine leere Liste
{
l.first = 0;
l.Anzahl = 0;
cout << "Liste wurde erstellt." << endl;
}
Liste::~Liste()
//lösche Liste
{
cout << "Liste wurde gelöscht." << endl;
}
Liste::find(Liste &l, int x)
//finde in Liste x
{
for (element p=l.first; p!=0; p=p->next)
return p;
return 0;
}
Liste::einfügen(List &Liste, element *wo, element *in)
//füge entweder an erster stelle oder nach x ein
{
if (wo==0)
{
  einfügen->next=l.first;
  l.first=einfügen;
  l.count=l.count+1;
}
else
{
  einfügen->next=wo->next;
  wo->next=einfügen;
  l.count=l.count+1;
}
}
Liste::loesche(Liste &Liste, element *wo, element *loesch)
//lösche ersten Eintrag oder nach x
{
element p;
if (wo==0)
{
  p=l.first;
  if (p!=0)
  {
   l.first=p->next;
   l.count=l.count-1;
  }
  return p;
}
p=wo->next;
if (p!=0)
{
  wo->next=p->next;
  l.count=l.count-1;
}
return p;
}



#include <iostream>

using namespace std;

class Liste
{
public:
Liste (int leer);
~Liste();
int ausgabe;
struct find;
struct loesche;
struct einfügen;
private:
struct element;
}

Liste::element()
//ein einzelnes Listenelement
{
element *next;
int wert;
}
Liste::Liste(int leer)
//erstelle eine leere Liste
{
l.first = 0;
l.Anzahl = 0;
cout << "Liste wurde erstellt." << endl;
}
Liste::~Liste()
//lösche Liste
{
cout << "Liste wurde gelöscht." << endl;
}
Liste::find(Liste &l, int x)
//finde in Liste x
{
for (element p=l.first; p!=0; p=p->next)
return p;
return 0;
}
Liste::einfügen(List &Liste, element *wo, element *in)
//füge entweder an erster stelle oder nach x ein
{
if (wo==0)
{
einfügen->next=l.first;
l.first=einfügen;
l.count=l.count+1;
}
else
{
einfügen->next=wo->next;
wo->next=einfügen;
l.count=l.count+1;
}
}
Liste::loesche(Liste &Liste, element *wo, element *loesch)
//lösche ersten Eintrag oder nach x
{
element p;
if (wo==0)
{
p=l.first;
if (p!=0)
{
l.first=p->next;
l.count=l.count-1;
}
return p;
}
p=wo->next;
if (p!=0)
{
wo->next=p->next;
l.count=l.count-1;
}
return p;
}

Vielen Dank im Voraus.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
16.12.2005, 17:58 Uhr
Aconcagua



Ziemliches Chaos.

Erst mal fehlen bei den Methoden die Rückgabewerte; die entfallen NUR bei Konstruktoren.

Dann sind einige Variablen, die in den Methoden verwendet werden, gar nicht in der Klasse deklariert, so z. B. first, Anzahl, count, ...

Die Methoden sind als 'struct' deklariert, was (pardon, dass ich so direkt bin) völliger Blödsinn ist. structs sind nicht viel anders als classes, nur dass implizit alle member public sind.

Pascal-Erfahrung? Soweit ist rein funktional programmiert, C++ unterstützt Objektorientierung. Das könnte man in der Kurzfassung so beschreiben, dass Klassen selbst arbeiten können:

Liste erzeugen, an ihr Methoden aufrufen:


C++:
// Liste wird erzeugt
List* list = new List();
// liste führt methode xyz aus
list->xyz();



In diesem zusammenhang unpraktisch, wenn auch nicht falsch, ist, dass die Methoden sämtlichst die Liste übergeben bekommen - dann könnte man sie auch 'static' deklarieren, da sie das eigene Objekt gar nicht benötigen, besser aber ist es in diesem Fall, die Übergebene Liste wegzulassen und stattdessen die Methode "am eigenen Objekt" aufzurufen (falls nicht klar ist, was ich hiermit meine, bitte in Büchern den Unterschied zwischen Klassenmethoden einerseits und Objekt- bzw. Instanzmethoden andererseits nachlesen).

Hab' mir mal die Mühe gemacht, das selbst zu implementieren, die main() ist ein kleines Anwendungsbeispiel, ich hoffe, das hilft weiter.


C++:
#include <iostream>

class List {
private:
   // innere ElementKlasse zum Speichern der ListenElemente
   class Element {
   public:
      Element() {next = 0;}
      ~Element() {}
      
      // zeiger auf NachfolgeElement
      Element* next;
      // int*, um Daten zu simulieren. Stattdessen Pointer
      // auf entsprechendes Datenobjekt, das gespeichert werden soll.
      int* data;
   };
  
   // ListenKopf
   Element* head;
public:
   List() {head = 0;}
   ~List() {
      // löscht alle Elemente in der Liste
      while(head != 0) {
         Element* hd = head;
         head = head->next;
         delete hd;
      }
   }
  
   void insert(int* wo, int* in);
   // Bequemlichkeitsmethode
   void insert(int* in) {insert(0, in);}
   int* remove(int* data);
   int* find(int pos);
};

void List::insert(int* wo, int* in) {
   Element* elem = new Element();
   elem->data = in;
   Element* e = head;
  
   if(wo) {
      // falls ListenElement da und data != wo
      // überspringe
      while(e && e->data != wo)
         e = e->next;
      
      // falls wo gefunden
      // dahinter einfügen
      if(e) {
         elem->next = e->next;
         e->next = elem;
         return;
      }
   }
  
   // hierher gelangt man, falls wo == 0
   // oder falls wo nicht in Liste gefunden
  
   // in am ListenAnfang einfügen
   elem->next = head;
   head = elem;
}

int* List::remove(int* data) {
   Element* e = head;
   // zeiger auf vorheriges Element
   Element* eAlt = 0;
   if(data) {
      while(e && e->data != data) {
         eAlt = e;
         e = e->next;
      }
      if(e) {
         if(eAlt)
            eAlt->next = e->next;
         else
            // eAlt nie gesetzt -> while-Schleife nie betreten
            // -> gesuchtes Element ist Listenkopf
            head = head->next;
        
         int* data = e->data;
         delete e;
         return data;
      }
   } else {
      // kein data angegeben, lösche ListenKopf
      if(head) {
         head = head->next;
         // e zeigt noch auf den alten head
         int* data = e->data;
         delete e;
         return data;
      }
   }
   // nichts zu löschen
   return 0;
}

int* List::find(int pos) {
   int p = 0;
   Element* e = head;
   while(p < pos && e) {
      e = e->next;
      p++;
   }
   if(e)
      return e->data;
   else
      return 0;
}

int main() {
   List* list = new List();
   int num[] = {1, 2, 3, 4, 5, 6};
   list->insert(&(num[0]));
   list->insert(&(num[3]));
   std::cout << *(list->remove(0));
   std::cout << *(list->find(0));
}



Dieser Post wurde am 16.12.2005 um 18:01 Uhr von Aconcagua editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: