Überladen des operators [] für QList derivat

Alles rund um die Programmierung mit Qt
Antworten
motomoto
Beiträge: 10
Registriert: 7. April 2010 07:31

Überladen des operators [] für QList derivat

Beitrag von motomoto »

Hi, mein C++ ist etwas eingerostet. Habe folgenden Code:

Code: Alles auswählen

class Item {
public:
    QString name;
    QString rule;
    QString result;
};

class Items : public QList<Item> {
public:
    Item& operator[](const QString& name) {
        for (int i=0; i<count(); ++i)
            if (name == (*this)[i].name)
                return (*this)[i];
        throw "Not found"                ;
    };
};
Wie man sieht überlade ich den subscribe operator. Der Compiler beschwert sich jedoch mit "invalid conversion from 'int' to 'const char*'- Offensichtlich hat er den []-operator der Basisklasse vergessen.
Warum kann ich nicht einfach den Operator für ein anderes Argument zusätzlich definieren?
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

QList kennt auch ein at(int).
Und nur für einen neuen operator[] ist das Ableiten unnötig.
Du suchst qFind, oder wenn es etwas spezieller sein soll std::find_if mit nem speziellen Predicate.

Desweiteren gibt es in deinem QList-Derivat keinen operator[](int) mehr! Den bekommst du erst wieder mit ner passenden "using"-Direktive.
Aber ich würde sagen lass das Ableiten bleiben, nur für das bisschen syntactic sugar lohnt es sich nicht ;)
motomoto
Beiträge: 10
Registriert: 7. April 2010 07:31

Beitrag von motomoto »

franzf hat geschrieben:QList kennt auch ein at(int).
Und nur für einen neuen operator[] ist das Ableiten unnötig.
Du suchst qFind, oder wenn es etwas spezieller sein soll std::find_if mit nem speziellen Predicate.
Das ist nur ein verkürztes Snippet. Die Ableitung ist eine Liste, hat aber einige Funktionen mehr als gezeigt. Da ich aus der Pascal-Ecke komme lege ich immer Wert auf klare Schreibweisen und da ist der subscribe-operator nett. Leider artet C++ immer eine Orgie aus Sternchen, spitze Klammern und ähnliche hässlichkeiten aus -> und . -Bezügen. Iteratoren machen die Sache noch hässlicher. Wozu soll die Liste sich wie ein Array verhalten, wenn man sie nicht so benutzen soll?

Habe den Kern des Algorithmus (einen Solver für sich gegenseitig referenzierende Variable) schon mal in Pascal geschrieben und habe mich geärgert, dass das selbe in C++ so viel hässlicher und umständlicher aussieht. Aber wahrscheinlich muss ich wieder besser in die C++-Sachen einsteigen. Der neueste Schrei scheint ++i statt i++ zu sein. Soll manchmal noch effektiver sein.
franzf hat geschrieben:Desweiteren gibt es in deinem QList-Derivat keinen operator[](int) mehr! Den bekommst du erst wieder mit ner passenden "using"-Direktive.
Das kapier ich nicht. Wieso erbt meine Klasse nicht einfach? Meinst du ich sollte meine Klasse in einen anderen namespace verlagern?

Dank und Grüße
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

OOP heißt nicht nur ableiten und alles in Klassen packen! Du kannst Klassen erweitern über freie Funktionen. Wenn du in deiner abgeleiteten Klasse nur auf das public interface zugreifst (und das tust du definitv, denn QList bietet keine protected-Methoden, auf die du Zugriff hättest), fährst du genauso gut mit freien Funktionen. Für eine eigene operator[]-Überladung ist das natülich nichts - aber in meinen Augen kannst du da auch drauf verzichten...
Dann gibt es immer noch die Möglichkeit, dein QList-Objekt als Member einer eigenen Klasse zu speichern, und alle Funktionen/Operatoren die du benötigst in dieser Klasse anzubieten und jenachdem einfach nur auf das QList-Objekt weiterzuleiten oder eben eigene Implementierungen anzugeben.

Und die "*" und "->" und "." gehören bei C++ halt mal dazu, wenn du damit nicht klarkommst und genervt bist such dir ne andere Sprache.
Der neueste Schrei scheint ++i statt i++ zu sein. Soll manchmal noch effektiver sein.
Der neueste Schrei?!? Das liegt einfach in der Materie der Sache. i++ erzeugt eine Kopie, erhöht den Wert und gibt den alten Wert zurück. ++i erhöht direkt und returned. Eine Kopie weniger, das ist einfach effizienter. Und wenn du die Kopie eh nur verwirfst ist das total unnötig und hat nichts mit Mode oder so zu tun.
Einen Effekt hat das aber nur, wenn hinter dem "i" eine Klasse steht. Bei int ist das sicher wurscht, kann der Compiler ausreichend optimieren.
Das kapier ich nicht. Wieso erbt meine Klasse nicht einfach? Meinst du ich sollte meine Klasse in einen anderen namespace verlagern?
Weil die neue Methode gleichen Namens in deiner abgeleiteten Klasse die genauso benannten Methoden der Basisklasse überdeckt. Mit using kannst du die Namen aber in den Namensraum deiner Klasse holen.
Und die Klasse in einen anderen namespace zu packen macht gar keinen Sinn - Problem bleibt.
Wie das jetzt aber mit der template-Basisklasse genau geht kann ich dir nicht sagen, in templates bin ich nie so richtig tief eingestiegen.
So würde das mit normalen Klassen gehen:

Code: Alles auswählen

#include <string>
#include <iostream>
using namespace std;

struct Test {
  void run( int val ) const { cout << "Test " << val << endl; }
};

struct Der : public Test {
  using Test::run; // kommentier das mal aus und freu dich über die bekannte Fehlermeldung
  void run( string val ) const { cout <<  "Der " << val << endl; }
};

int main() {
  Der d;
  d.run( 10 );
}
motomoto
Beiträge: 10
Registriert: 7. April 2010 07:31

Beitrag von motomoto »

Ich weiß was du meinst. Manche Klassen sind nicht so zum ableiten da, weil sie eh keine protected member haben.
Weil die neue Methode gleichen Namens in deiner abgeleiteten Klasse die genauso benannten Methoden der Basisklasse überdeckt. Mit using kannst du die Namen aber in den Namensraum deiner Klasse holen.
Und die Klasse in einen anderen namespace zu packen macht gar keinen Sinn - Problem bleibt.
Wie das jetzt aber mit der template-Basisklasse genau geht kann ich dir nicht sagen, in templates bin ich nie so richtig tief eingestiegen.
So würde das mit normalen Klassen gehen:

Code: Alles auswählen

#include <string>
#include <iostream>
using namespace std;

struct Test {
  void run( int val ) const { cout << "Test " << val << endl; }
};

struct Der : public Test {
  using Test::run; // kommentier das mal aus und freu dich über die bekannte Fehlermeldung
  void run( string val ) const { cout <<  "Der " << val << endl; }
};

int main() {
  Der d;
  d.run( 10 );
}
Sehr schön. Mit using klappts nun auch bei mir:

Code: Alles auswählen

...
class VarItems : public QList<VarItem> {
public:
    VarItem& operator[](const QString& name);
    using QList<VarItem>::operator[];
...
};
Also um Mißverständnisse zu vermeiden: Ich finde C++ schon einen Geniestreich. Ist bloß einerseits ein bischen veraltet und ich verzettel mich immer leicht in der Hübschmacherei. Habe aber einige Sparchfeatures in Delphi zu schätzen gelernt - Metaklassen, Methodenzeiger, Properties was einem alles die Model/View-Geschichten erleichtert. Durch den MOC von Qt wird das C++ aber ganz sinnvoll aufgebohrt - und die mitgelieferten Klassenbibliotheken machen auch einen tollen Eindruck. Das Signal/Slot-Konzept ist ein Kracher! Da wird die alte Tante C++ nochmal richtig sexy.

In diesem Sinne - weiterhin viel Spaß.
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Ich sehe trotzdem noch keinen Sinn von QList<> abzuleiten - was willst Du damit erreichen?
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
motomoto
Beiträge: 10
Registriert: 7. April 2010 07:31

Beitrag von motomoto »

Christian81 hat geschrieben:Ich sehe trotzdem noch keinen Sinn von QList<> abzuleiten - was willst Du damit erreichen?
Es soll eine Liste von Name/Rule/Value-Tripels verwaltet werden, deren Bildungsregeln sich gegenseitig referenzieren können. Ein Solver löst diese Abhängigkeiten auf. Die Liste soll als eine Art Model im Sinne von Model/View vorliegen. Der wiederverwendbar benachrichtigende Mittler soll Änderungen in der Liste mitteilen (heißt das Delegate in Qt?). Der Anwender kann eigene Tripels definieren. Es handelt sich um einen Webgallery-Generator dessen Prozessor von der GUI unabhängig sein soll, damit er z.B. auch als nicht-graphische Anwendung laufen kann.

Klar, ich könnte die Liste auch als Member verwalten. Die GUI kennt die Klasse eh und benötigt keine Polymorphie. Aber damit wäre ich meiner eigenen Frage aus dem Weg gegangen und das ist Feigheit, die ein echter Klingonenprogrammierer nicht kennt.

Die Anwendung liegt in einer ersten Version (in Delphi geschrieben) im Web unter http://www.atomek.de/gallerypony/downlo ... ySetup.exe
Falls jemand das Ding ausprobieren möchte und es gibt Schwierigkeiten beim Laden von Fotos - ImageMagick separat installieren.
Damit produziere ich umfangreiche Foto-Webgalerien und wollte die Sache mal auf Qt portieren. So lerne ich Qt und vielleicht kann ich ImageMagick noch besser einbinden als mit Delphi.
Aber das nur am Rande.

Schönen Tag euch allen
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

motomoto hat geschrieben:Die Liste soll als eine Art Model im Sinne von Model/View vorliegen. Der wiederverwendbar benachrichtigende Mittler soll Änderungen in der Liste mitteilen (heißt das Delegate in Qt?).
Da ist dein Ansatz aber völlig Pustekuchen :P
Du suchst http://doc.trolltech.com/4.6/model-view ... mming.html
Speziell was die einzelnen Begriffe angeht solltest du dir das nochmal durchlesen. Ein "Delegate" bei Qt4 ist für das Rendern von Items + User-Input zuständig.
Wenn du eh vorhast, das in einer View zu präsentieren solltest du auch daran denken, gleich ein vernünftiges Model zu schreiben.
Klar, ich könnte die Liste auch als Member verwalten. Die GUI kennt die Klasse eh und benötigt keine Polymorphie. Aber damit wäre ich meiner eigenen Frage aus dem Weg gegangen und das ist Feigheit, die ein echter Klingonenprogrammierer nicht kennt.
Und ein Klingonenprogrammierer verwendet auch nur das was er sich selber ausgedacht hat und hört nicht auf Ratschläge Anderer?
Im Ernst: Nur weil du jetzt weißt, wie du den Compileerror aus dem Weg räumst, heißt das noch nicht dass der Ansatz gut ist. Ich hoffe inständig, dass du nicht wirklich vor hast deine Klasse polymorph zu verwenden. HINT: QList hat keinen virtuellen Destruktor!

Ein weiterer Nachteil deiner Herangehensweise ist, dass du mit deinem neuen operator[](QString) nur immer EINEN passenden Wert rausholst, und dabei nichtmal den zuletzt eingefügten (wie das z.B. bei QMap der Fall wäre). Deshalb sind Iteratoren eine feine Sache.
Alternativ könntest du eine Funktion "findAll" schreiben, die gleich eine QList<Item> zurück gibt. Der User kann sich dann aussuchen welche Items er verwenden will.
So lerne ich Qt und vielleicht kann ich ImageMagick noch besser einbinden als mit Delphi.
Für was genau verwendest du ImageMagick?
motomoto
Beiträge: 10
Registriert: 7. April 2010 07:31

Beitrag von motomoto »

franzf hat geschrieben:
motomoto hat geschrieben:Die Liste soll als eine Art Model im Sinne von Model/View vorliegen. Der wiederverwendbar benachrichtigende Mittler soll Änderungen in der Liste mitteilen (heißt das Delegate in Qt?).
Da ist dein Ansatz aber völlig Pustekuchen :P
Du suchst http://doc.trolltech.com/4.6/model-view ... mming.html
Speziell was die einzelnen Begriffe angeht solltest du dir das nochmal durchlesen. Ein "Delegate" bei Qt4 ist für das Rendern von Items + User-Input zuständig.
Wenn du eh vorhast, das in einer View zu präsentieren solltest du auch daran denken, gleich ein vernünftiges Model zu schreiben.
Ok. Was die Liste angeht hast du mich überzeugt. Da ich schon öfter Listen in einem Model verwaltet habe (auch Listen von Listen) und die benachrichtigende Anbindung des Models an die GUI immer sehr mühselig ist, grübel ich über eine elegantere Möglichkeit nach.

Ich lese gerade das Buch C++ GUI Programmierung mit Ot 4 von Blanchette/Summerfield. Aber nur lesen und auswendig lernen ist mir zu ermüdend, daher versuche ich früh etwas auf die Beine zu stellen und orientiere mich auch an Techniken, die ich früher eingesetzt habe.
Und ein Klingonenprogrammierer verwendet auch nur das was er sich selber ausgedacht hat und hört nicht auf Ratschläge Anderer?
Im Ernst: Nur weil du jetzt weißt, wie du den Compileerror aus dem Weg räumst, heißt das noch nicht dass der Ansatz gut ist. Ich hoffe inständig, dass du nicht wirklich vor hast deine Klasse polymorph zu verwenden. HINT: QList hat keinen virtuellen Destruktor!
Haaalo, das mit dem Klingonenprogrammierer war ein Spaß mit dem ich auszudrücken versuchte, dass man auch mal Mut zum probieren haben sollte. Klar dass sich alles verbessern lässt. Darum poste ich hier ja auch und freue mich über deine Antworten. Über die QList habe ja eben auch einiges gelernt.
Ein weiterer Nachteil deiner Herangehensweise ist, dass du mit deinem neuen operator[](QString) nur immer EINEN passenden Wert rausholst, und dabei nichtmal den zuletzt eingefügten (wie das z.B. bei QMap der Fall wäre). Deshalb sind Iteratoren eine feine Sache.
Alternativ könntest du eine Funktion "findAll" schreiben, die gleich eine QList<Item> zurück gibt. Der User kann sich dann aussuchen welche Items er verwenden will.
Stimmt, die Keys sind hier allerdings unique.
Für was genau verwendest du ImageMagick?
Es handelt sich bei meinem Programm um einen Generator für Webgallerien. Dateien unterschiedlicher Formate sollen geladen und verändert und wieder gespeichert werden. Das kann ImageMagick ganz gut (viele Formate, gute Qualität). Derzeit muss das Programm resizen, drehen, ausschneiden und etwas Dekoration zufügen (3D-Bilderrahmen für die Thumbnails). Das kann ImageMagick in hervorragender Qualität. Die Ergebnisse sehen besser aus als die Anzeige vieler Viewer (insbesondere selbstgeschriebener). Dazu gehört die automatisierte Manipulation von HTML, CSS und anderer Textdateien.
Schau mal die Beispielgallerien an:
http://www.atomek.de/gallerypony/examples/index.html
Die Fotoapparate sind Billigmodelle, deren Ergebnisse ich dadurch verbessere, dass ich grundsätzlich etwas unterbelichte und mit JpgIlluminator die Bilder nachbearbeite. Trotzdem sind die Ergebnisse akzeptabel und das liegt auch am Resizing mit ImageMagick.
Zunächst habe ich mit WSH und JavaScript Skripte zur Generierung geschrieben, aber das funktioniert nur sehr speziell. Die GUI-version ist insbesondere durch den Variablen-Solver, den ich gerade nach C++ portiere sehr leistungsfähig geworden (flexibel und einfach in der Bedienung). Die Gallerien basieren auf Template-Projekte und werden selbst in Projekten gespeichert, sodass sie später Änderbar sind.
Kennst du ImageMagick? Mich hat das überzeugt. Es lässt sich in Skripten recht einfach verwenden und auch in Dll-fähige Hochsprachen einbinden.
Eine andere Anwendung habe ich geschrieben zum Einscannen von Dokumenten mit TWAIN. Darin entferne ich mitgescannte Fussel mit der ImageMagick decrackle-Funktion.
Die Doku ist nicht so gut wie bei Qt, aber man findet sich zurecht.

Grüße
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Ich sehe trotzdem noch keinen Sinn von QList<> abzuleiten - was willst Du damit erreichen?
Ich wuerd es sogar noch deutlicher artikulieren:
Ich find es gefeaehrlich von QList<> abzuleiten. gefaehrlich == ganz mies im C++ jargon, steht fast auf selber stufe wie "undefiniertes verhalten" ^^

@motomoto
Du machst nen ziemlichen Anfaengerfehler. (weil grad Anfaenger machen genau das besonders gern)
Das was dein Ansatz kaputthaut, iss Vererbung. Es gibt mehrere möglichkeiten vorhandenen Code (wieder)zuverwenden.
Vererbung iss designtechnisch der schlechteste Ausdruck für die Technik. Besser sollt es Polymorphie heissen, weil es dem wesen einfach naeher kommt.
Und eigentlich iss es gar ned so schwer zu beantworten, ob man polymorphie braucht !
In deinem Fall:
Musst du dein Konstrukt irgendwo an irgendeiner Stelle dringend als Basisklasse, in dem konkreten Fall als QList<> deinem code verkaufen, z.b. weil du es mit richtigen QList<> elementen gleichbehandelst ... oder es code(Bibliotheken, API's) unterschieben musst , die du nicht aendern kannst ???
Nur wenn du die Frage mit eindeutigem Ja beantwortest, iss Polymorphie designtechnisch wirklich sauber. Ansonsten sollte immer Aggregation das Mittel deiner Wahl sein !!!

Ciao ...
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

Für alles außer das Fuseln entfernen kannst du auch gleich die Qt-Klassen benutzen. resize, crop, transform können die alle (QPixmap, QImage, QBitmap).
Bei QImage hast du auch die Möglichkeit, schnell die Pixel zu manipulieren, für Helligeit hochdrehen usw.

Für die 3D-Bilderrahmen brauchst du auch gar kein ImageMagick. Ich würde die Grafiken über das Template mitliefern. Etwas CSS und alles passt. Du veränderst ja das eigentliche Bild nicht, sondern setzt das in einen schwarzen Hintergrund und fügst dann den Rahmen hinzu.
Macht auch eine Reaktion auf Wünsche der Benutzer leichter. Wenn dem einfällt, dass die Bilder nicht auf schwarzen sondern grauem Hintergrund liegen sollen, muss der dann nicht die ganze Galerie neu erstellen lassen, sondern kann per Hand das StyleSheet bearbeiten.

Und das Fusel entfernen würde ich ehrlich gesagt dem User überlassen. Ich selber hab ne Digitalkamera mit USM am Sensor, das Pustet Staub und Dreck regelmäßig runter. Und wenn ich meine 6*9cm-Dias scannen lasse geschieht dies sehr aufwändig (werden mit Öl beschmiert und auf Glas geheftet, da ist auch kein Staub mehr drauf).
Ein Entstauben kann bei Fuselfreien Bildern nämlich zu Qualitätsverlust führen ;)

Und OT: Ich würde nicht unterbelichten. Auch eine Digitalkamera bewältigt nur ein bestimmtes Kontrastverhältnis. Bei Unterbelichtung läufst du Gefahr, Details in den Schatten zu verlieren. Ich würde sagen versuch es mit Belichtungsreihen. in 0.5-Blendenschritten nach unten und oben korrigieren (also 5 Aufnahmen) dann ist ein Bild dabei das korrekt belichtet ist.
motomoto
Beiträge: 10
Registriert: 7. April 2010 07:31

Beitrag von motomoto »

RHBaum hat geschrieben:
Ich sehe trotzdem noch keinen Sinn von QList<> abzuleiten - was willst Du damit erreichen?
Ich wuerd es sogar noch deutlicher artikulieren:
Ich find es gefeaehrlich von QList<> abzuleiten. gefaehrlich == ganz mies im C++ jargon, steht fast auf selber stufe wie "undefiniertes verhalten" ^^
Das war mir nicht so klar. Ich will natürlich nichts Gefährliches tun. Womöglich zerhackt es mir den Rechner. Aber im Ernst, eigentlich bin ich noch in der Design-Findungsphase und ich habs mit Ableitung versucht (und wieder verworfen) aber die ursprüngliche Frage, warum der operator[](int) nicht vererbt wird, wenn ich einen anderen definiere wollte ich trotzdem geklärt haben.
@motomoto
Du machst nen ziemlichen Anfaengerfehler. (weil grad Anfaenger machen genau das besonders gern)
Oh Mann, das Wort wollte ich jetzt gar nicht hören. Ich glaube ich poste lieber keine Fragen mehr.
Das was dein Ansatz kaputthaut, iss Vererbung. Es gibt mehrere möglichkeiten vorhandenen Code (wieder)zuverwenden.
Vererbung iss designtechnisch der schlechteste Ausdruck für die Technik. Besser sollt es Polymorphie heissen, weil es dem wesen einfach naeher kommt.
Is klar. Ich würde sogar noch weiter gehen und Vererbung als einen Trick definieren, Code zu sparen. Für die Polymorphie sind z.B. abstrakte Basisklassen besser. Aus Java habe ich die Interfaces schätzen gelernt, aber da ist bei C++ (wie fast immer) nur mit Trickserei was zu machen. So würde ich meinem Solver einfach ein Interface verpassen "verhält sich wie eine Liste" und die QList intern verwenden. Klar, das kann mit abstrakten Basisklassen und Mehrfachvererbung machen (oder auch Aggregation eines entsprechenden Objektes, das das Interface implementiert). Aber wie gesagt, ich bin da noch in der Findungsphase. Nachsicht ist hier gefragt.
Auf jeden Fall Dank für die Hinweise.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

motomoto hat geschrieben:
@motomoto
Du machst nen ziemlichen Anfaengerfehler. (weil grad Anfaenger machen genau das besonders gern)
Oh Mann, das Wort wollte ich jetzt gar nicht hören. Ich glaube ich poste lieber keine Fragen mehr.
Das ist aber eigentlich nicht böse gemeint, jenes Wort ;)
Wenn man mit den Spezialitäten und Eigenheiten einer Programmiersprache noch nicht verheiratet ist ist man halt ein Anfänger ;)
Und speziell die Entscheidung, wann Ableitung die korrekte Entscheidung zur "Erweiterung" von Funktionalität ist, fällt anfangs relativ schwer.

Hier mal eine kleine Geschichte :P
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Oh Mann, das Wort wollte ich jetzt gar nicht hören. Ich glaube ich poste lieber keine Fragen mehr.
Hey, so war das ned gemeint, sorry ... eher positiv
Viele Andere machen diese "Fehler" auch.
Und, es ist ein Designfehler. Also ein fehler dessen der Code trotzdem funktioniert (wahrscheinlich), und von vielen deshalb ned als "Fehler" wahrgenommen wird.
Ich mein, wir koennen Dir hier viel erzaehlen, aber eigentlich lernt man am besten doch aus Schmerz :twisted: Und um obiges Problem mal richtig am eigenen Leib gespuert zu haben, muss man sich halt doch mal voll in einer aufgeblassenen Objecthirarchie voll verzettelt haben.
Mir gings eh genau so ... Nebenwirkungen ? ach was ! ^^ Naja wenn man mal klassen hat von der untersten ebene bis zur basis ueber 10 elemente, und eine kleinere aenderung einen den Schweiss auf die Stirn treibt .... dann iss man soweit ^^
Ich würde sogar noch weiter gehen und Vererbung als einen Trick definieren, Code zu sparen.
Genau das mein ich. In der Praxis sieht es halt gegenteilig aus. Verwendest du Polymorphie, hasst meisst scho mit Dir gerungen und Aufwand in kauf genommen um eine "Saubere" Schnittstelle zu definieren.
Für die Polymorphie sind z.B. abstrakte Basisklassen besser
ja und auch nur dann sollte man Ploymorphie verwenden. Schnittstellen und Polymorphie sollte man wirklich nur im Zusammenhang haben.
Und abstrakt ist sollt man nicht ganz so zwingend sehen. Abstrakt ist eigentlich die natürlichere Form. Es gibt aber noch so themen wie Dafeaultimplementationen .... die eine Abweichung von der 100%igen Abstrakten Basisklasse sinnvoll werden lassen. Und allzuoft lebt man nicht in einer perfekten OOP C++ welt, da muss man auch abstriche machen. (beispiel: private vererbung)
Nachsicht ist hier gefragt.
Haben wir doch eigentlich .... Wenn alle perfekt c++ koennten, gaeb es dieses Forum sicher nicht :-)
Lass dich nicht abschrecken wenn einiges "bisschen hart" klingt. Jeder hier iss nur Mensch, vieles ist anders gemeint ... und ab und an will man mit etwas Übertreibung auch vielleicht was Gutes erreichen ...
Aus Java habe ich die Interfaces schätzen gelernt,
Ich denk mal, grad umsattler aus anderen Sprachen haben es Designtechnisch besonders schwer.
Sprachlich hat c++ gegenueber Java 2 Riesen nachteile: Es muss compatibel zu C sein, und es muss hardwarenah / performant ( im sinne, man muss kosten vorher abschaetzen koennen) sein.
Das engt die Sprachmoeglichkeiten von C++ von haus aus ein.
C++ hat wenig Sprache(im sinne von Schlüsselwörter) es hat wenig Regeln (im Sinne von: da macht der compiler ned mit) aber viel viel Design (Im Sinne von: Es geht schon, aber "schoen" iss es nicht)

C++ hat seinen eigenen Style. Eleganz und Sauberkeit also "Schoenheit" von C++ code, dafuer muss man erst einen Sinn entwickeln ... von Aussenstehenden beurteilt wird es gegenueber Java z.b. immer den kürzeren ziehen.

Ciao ...
Zuletzt geändert von RHBaum am 20. April 2010 14:09, insgesamt 1-mal geändert.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Beitrag von franzf »

RHBaum hat geschrieben:ja und auch nur dann sollte man Ploymorphie verwenden. Schnittstellen und Polymorphie sollte man wirklich nur im Zusammenhang haben.
Und abstrakt ist sollt man nicht ganz so zwingend sehen. Abstrakt ist eigentlich die natürlichere Form. Es gibt aber noch so themen wie Dafeaultimplementationen .... die eine Abweichung von der 100%igen Abstrakten Basisklasse sinnvoll werden lassen.
Ich denke ein gewaltiger Unterschied hier zwischen java und C++ ist multiple inheritance. Das gibt es in Java nicht. Deshalb braucht man da Interfaces - und da ist nicht mal ne default implementation möglich. Ein interface in C++ ist eine Klasse mit nur "pure virtual"-Methoden - wobei auch pure-virtual-Methoden eine Implementierung haben können!
Und virtuelle Methoden im Interface mögen manche Leute nicht. Google mal nach "non virtual Interface". So etwas ist in java nur schwer umzusetzen. (nicht RHBaum, der weiß das ;))
Antworten