2x gleiche Methode mit anderen Parameter

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
DBGTMaster
Beiträge: 190
Registriert: 19. August 2010 10:00

2x gleiche Methode mit anderen Parameter

Beitrag von DBGTMaster »

Hallo,

ich habe 2 Methoden:

Code: Alles auswählen

    static bool _insert(const QList< QPair<QString, QVariant> >& params,
                        const QString &tableName = QString());
    static bool _insert(const QHash<QString, QVariant>& params,
                        const QString &tableName = QString());
Beide Methoden machen genau das selbe, nur bei der erster Parameter ein QList erwartet wird, und bei der 2ten Methode ein QHash.

Der Grund der 2 Methoden ist, dass ich manchmal ein QHash bei Hand habe (wenn eine Sortierung nötig ist), ist keine Sortierung der Elemente nötig, komme ich mit einem QList daher...

Wie kann ich nun die Deklaration durchführen, ohne doppelten Code zu erhalten??
Ich habe es nunmal so gelöst, indem ich das QHash in ein QList umwadle und dieses der QList Methode weitergebe:

Code: Alles auswählen

bool dbAbstractModel::_insert(const QHash<QString, QVariant> &params, const QString &tableName) {

    // In eine Liste umwandeln...
    QList<QPair<QString, QVariant> > list;
    QHash<QString, QVariant>::iterator it;
    for (it = params.begin(); it != params.end(); it++) {

        list.append( QPair<it.key, it.value );
    }

    _insert(list, tableName);
}
Mein Problem ist nun, wenn ich ein QHash mit mehreren 10.000 Elemente habe, habe ich ein wenig Performance- bedenken, wenn ich ständig konventieren kann.

Natürlich könnte ich nur QHash verwenden, aber ich will nicht sortieren, wenn es nicht nötig ist...
Oder kann ich als anternative dem QHash das sortieren einfach deaktivieren??

Gibts hier bessere Lösungen?
brax
Beiträge: 208
Registriert: 11. Mai 2010 11:22

Re: 2x gleiche Methode mit anderen Parameter

Beitrag von brax »

Erstmal das wichtigste: QHash ist nicht sortiert. Wenn Du das haben möchtest musst Du QMap benutzen:
Qt Docu hat geschrieben:When iterating over a QMap, the items are always sorted by key. With QHash, the items are arbitrarily ordered.
Insofern ist der einzige Unterschied, den Du jetzt hast, dass die Listenvariante doppelte QString-keys enthalten kann.

Allerdings wäre QHash tatsächlich ein Weg, doppelten Code zu vermeiden, indem einmal QHash und einmal QMap benutzt. Die haben ja ein sehr ähnliches Interface, dafür ist QHash fast genauso performant wie QList (siehe http://doc.trolltech.com/4.6/containers ... complexity). Dann lässt sich daraus eine Templatemethode machen, die sowohl mit QHash<QString,QVariant> als auch mit QMap<QString, QVariant> umgehen kann.
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: 2x gleiche Methode mit anderen Parameter

Beitrag von franzf »

Die template-Methode könnte statt dem Container-Typ auch nur den Iterator-Typen bekommen (so wie z.B. std::sort, std::find, etc.). Dann solltest du aber zwei Parameter übergeben: Iter first und last. (== Range based insert)
DBGTMaster
Beiträge: 190
Registriert: 19. August 2010 10:00

Re: 2x gleiche Methode mit anderen Parameter

Beitrag von DBGTMaster »

Jetzt noch die Frage, wie kann ich einen QHash::const_iterator & einen QMap::const_iterator als einen Parameter übergeben?? Laut qt- Doku finde ich keine gemeinsame Klasse, die ich als Parameter verwenden kann :(...

// Edit: Achso, auch die Iterator Methode als Template benutzen?
brax
Beiträge: 208
Registriert: 11. Mai 2010 11:22

Re: 2x gleiche Methode mit anderen Parameter

Beitrag von brax »

Du hast eine Template Methode, die zwei Parameter nimmt (Start-iterator und End-iterator). Der Typ dieser Parameter ist der Template Typ (idR T). Die Signatur wäre sowas wie

Code: Alles auswählen

template<class T>
void myMethod(T iterFirst, T iterEnd);
Wenn Du dann die Methode aufrufst gibst Du den Template Typen an (entweder QHash::const_iterator oder QMap::const_iterator). Da das Interface von beiden gleich ist, benutzt Du die Parameter im Body der Methode eh gleich.

Da Du nach einer gemeinsamen Oberklasse fragst, hab ich das Gefühl, dass Dir Template Methoden nicht so richtig klar sind und würde Dir raten, Dich da mal etwas einzulesen.
DBGTMaster
Beiträge: 190
Registriert: 19. August 2010 10:00

Re: 2x gleiche Methode mit anderen Parameter

Beitrag von DBGTMaster »

Hallo,

templates sind mir schon klar, wollte nur wissen, ob es andere alternativen gibt, da ich von einem template weichen wollte...

Habs aber nun so in der Art, wie du es gepostet hast, implementiert.
unusual
Beiträge: 9
Registriert: 7. Juli 2010 13:33

Re: 2x gleiche Methode mit anderen Parameter

Beitrag von unusual »

Was soll denn in der _insert-Methode mit QList gemacht werden? Ich würde Funktionalität eher dort zusammen.
Wenn die liste durchlaufen wird, dann würde ich in den jeweiligen Methoder eine "foreach"- Schleife durchlaufen und aus beiden eine gemeinsame Methode mit den Parametern QString und QVariant aufrufen, die sich um die "Einzelaufgabe" kümmert. (Rückgabe-Wert beispielsweise ein bool, ob die Schleife weiter durchlaufen werden soll).
Antworten