Anzeige:
Seite 2 von 2 ErsteErste 12
Ergebnis 16 bis 21 von 21

Thema: "Java"-Klassen für C++

  1. #16
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Nur das man weder in Java noch in C++ selber eine verkettete Liste machen wird, weil es dafür fertige Standardcontainer gibt.

    Und in C++ kannst du jeden Typ, auch primitive, in den Standardcontainer verwenden, weil der Container ohnehin vom Kompiler für genau diesen Typ bzw. die angebebene Basisklasse erzeugt wird.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  2. #17
    Registrierter Benutzer Avatar von Flummi
    Registriert seit
    01.01.2006
    Beiträge
    31
    Schon klar, dass es vorgefertigte Klassen gibt, es ging mir ja nur um ein Beispiel. Eventuell kommt man ja mal in die Verlegenheit, selbst etwas schreiben zu müssen, dass genau die selbe Problematik aufweist.
    Danke nochmals an alle für die tolle Hilfe

  3. #18
    Registrierter Benutzer Avatar von panzi
    Registriert seit
    04.05.2001
    Ort
    Kottingbrunn
    Beiträge
    609
    Will nur auf folgendes hinweisen: Was Templates sind weißt eh? Also in der STL (Standard Template Library) gibt es Templates für alles was man sich vorstellen kann. Bei einem Template (Vorlage) wird der Typ irgendeiner Variable ausgelassen, so das man ihn erst bei der Instantzierung ausfüllen kann. Damit schreibe ich einmal eine Listenklasse (ist in der STL schon erledigt) die ich dann für jeden Typ instanzieren kann.
    Code:
    #include <list>
    #include <string>
    
    //...
    
    std::list<int> intlist;
    
    intlist.push_back(5);
    intlist.push_back(7);
    intlist.push_back(3);
    
    // ...
    
    std::list<std::string> strlist;
    
    strlist.push_back("hallo welt");
    strlist.push_back("foo bar");
    Sowas gibts auch ab JDK 1.5 ("Java 5") und fnde ich viel besser als den crap mit dem Object gecaste. Ist eben typsicherer.
    Intel Core 2 Duo CPU 2.66GHz; Nvidia GeForce 8 8800 GTS; 4GB RAM; Fedora 12; KDE-testing

  4. #19
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Zitat Zitat von Flummi
    Schon klar, dass es vorgefertigte Klassen gibt, es ging mir ja nur um ein Beispiel. Eventuell kommt man ja mal in die Verlegenheit, selbst etwas schreiben zu müssen, dass genau die selbe Problematik aufweist.
    Jein

    Normalerweise hat man entweder eine Basisklasse oder ein Interface von dem alle Klassen ableiten bzw. das alle Klassen implementieren, oder man hat einen echt generischen Fall, wo man dann selber ein Template schreibt.

    Mir fällt jetzt außer den Containern in Java auch kein Fall ein, der die Sache mit Object als Basis aller Klassen benötigen würde.

    @panzi: die neuen Java Container sind leider nur syntaktisch vergleichbar, sie machen das Casten nur intern, zu einer echten generischen Implementierung hat es leider nicht gereicht

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  5. #20
    Registrierter Benutzer Avatar von panzi
    Registriert seit
    04.05.2001
    Ort
    Kottingbrunn
    Beiträge
    609
    Zitat Zitat von anda_skoa
    Jein @panzi: die neuen Java Container sind leider nur syntaktisch vergleichbar, sie machen das Casten nur intern, zu einer echten generischen Implementierung hat es leider nicht gereicht
    Stimmt. Das merkt man bei irgeneiner Methode (hab Namen vergessen), die trotzdem immer noch ein Object in der Schnitstelle hat.
    Intel Core 2 Duo CPU 2.66GHz; Nvidia GeForce 8 8800 GTS; 4GB RAM; Fedora 12; KDE-testing

  6. #21
    Registrierter Benutzer
    Registriert seit
    23.05.2004
    Beiträge
    592
    Ich denke nicht, dass man es unbedingt braucht, aber wie gesagt, es macht vieles einfacher. Zum Beispiel, wenn ich an eine doppelt-verkettete, lineare Liste denke, mit solchen Knoten:

    Code:
    ListenKnoten* next;
    ListenKnoten* prev;
    Object* value;
    Mit einem allumfassenden Basis-Objekt kann man den selben Knoten für alle Arten von Klassen verwenden, weil ich ja die Objekte immer casten kann.
    Wenn ich das nicht kann, müsste man zB ja für jede Art Value eine Subklasse der Basisklasse ListenKnoten machen, die dann fähig ist, die entsprechenden Objekte aufzunehmen. Oder irre ich da?
    Die Knoten kannst du mit Zeigern auf void untereinander verknüpfen. Ein void* kann nämlich auf jedes Objekt zeigen. Allerdings braucht man immer noch die Typinformation in irgendeiner Form, wenn Objekte mit einem nicht-trivialen Destruktor gespeichert werden sollen. Denn mithilfe eines void* alleine kommt man nicht an den Destruktor heran. In deinem Beispiel würde eine gemeinsame Basisklasse also tatsächlich helfen. Nur muss man im Gegenzug auch beachten, dass eine gemeinsame polymorphe Basisklasse gleich alle Objekte deren Typ eine Klasse ist aufblähen würde. Allerdings glaube ich mittlerweile das eine gemeinsame Basisklasse für alle Klassen, die sowieso schon polymorph sind ein guter Kompromiss wäre. Das würde sich mit verbreiteten C++-Implementierungen mit "fast" Null-Overhead bewerkstelligen lassen. Man könnte dann ja auch immer noch einen Mechanismus haben, um diese Basisklasse zu verhindern, wenn das wirklich gewünscht wird.

    Noch ein letzter Punkt: In Java kann man ja nur *Referenzen* auf Objekte von Klassenttyp (also nicht "int" z.B.) in Collections packen, oder sagen wir mal in die Collections des JDK. Wenn man ähnlich dazu nur Pointer in C++-Containern speichern würde, dann würde dein Beispiel von oben nicht gelten. Denn Pointer haben einen trivialen Desktruktor, damit ist Kenntniss des exakten Typs nicht unbedingt notwendig um den Speicher für sie sauber abzuräumen. Allerdings ist damit immer noch nicht die ganze Wahrheit gesagt, um dein Beispiel betreffend Java und C++ zu vergleichen, aber ich höre jetzt trotzdem auf zu schreiben...

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •