Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » STL list, find und opertor==

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
01.03.2006, 14:43 Uhr
ip



Hoi!

Zunächst eine grobe Übersicht über mein Dilemma:

Ich habe eine Klasse CFoo, welche einen Bezeichner String enthält. Ich möchte meine Instanzen in einer STL Liste sichern und mithilfe des find Algorithmus das Objekt mit einem bestimmten Bezeichner String finden.

Ich hatte das ganze wie folgt implementiert:


Code:
class CFoo {
    public:
        string Bezeichner;
        bool operator== (CFoo compare) {
             return this->Bezeichner == compare.Bezeichner;
        }
        CFoo(string bez) {
            Bezeichner = bez;
        }
}

list<CFoo> neFooListe;

find(neFooListe.begin(), neFooListe.end(), CFoo("I seek you"));



Das funktionierte soweit auch ganz gut. Jetzt trat aber in einem anderen Zusammenhang ein fehler auf, den ich zuvor schon vermutete und zwar mit einer kleinen Zeiger Referenz:

Eine weitere Klasse, wir nennen sie CFooObserver, besitzt einen Zeiger auf einzelne CFoo Objekte. Das Problem ist, dass bei der list<CFoo>.push_back() Operation eine Kopie des Objektes angelegt wird und nicht das Objekt selbst in die Liste aufgenommen wird. Dass das nicht schön ist, wenn ich mit Zeiger Referenzen arbeite sollte kar sein.

Alles halb so wild dachte ich mir, man mache aus der list<CFoo> einfach eine list<CFoo*> und der berühmte Käs' ist gegessen. Mein Code sieht jetzt wie folgt aus:


Code:
Class CFoo {
    public:
        string Bezeichner;
}

bool opertaor==(CFoo* foo1, CFoo* foo2) {
     return foo1->Bezeichner == foo2->Bezeichner;
}
list<CFoo*> neFooListe;

find(neFooListe.begin(), neFooListe.end(), &CFoo("I seek you"));


Die Cracks unter euch haben bestimmt schon aufgeschrien und können den Compiler Error vor'm geistigen Auge sehen ohne, dass ich ihn in den Mund genommen habe, aber ich habe keine Ahnung warum mein Compiler folgendes ausspuckt und wie ich einen passenden Workaround für mein Problem angehen kann:

error: bool opertaor==(CFoo*, CFoo*) must have an argument of class or enumrated type

Any suggestions?

Gruesse

Daniel
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
01.03.2006, 16:19 Uhr
Spacelord
Hoffnungsloser Fall



C++:
#include <iostream>
#include <string>
#include <list>
#include <algorithm>

using namespace std;

class CFoo
{
public:
    string Bezeichner;
    CFoo(string bez) {
        Bezeichner = bez;
    }
    bool compare_with_pointer(const CFoo *foo)const {
        return this->Bezeichner == foo->Bezeichner;
    }
};

int main()
{
    list<CFoo*> neFooListe;
    CFoo f1("dudoedeldido!");
    CFoo f2("dudoedeldidi!");
    neFooListe.push_back(&f1);
    neFooListe.push_back(&f2);

    list<CFoo*>::iterator it;
    it = find_if(neFooListe.begin(), neFooListe.end(),bind2nd(mem_fun(&CFoo::compare_with_pointer),&CFoo("dudoedeldidi!")));
    if(it != neFooListe.end())
        cout<<"Der Bezeichner ist: "<<(*it)->Bezeichner<<endl;
    else
        cout<<"Nicht gefunden !"<<endl;

    it = find_if(neFooListe.begin(), neFooListe.end(),bind2nd(mem_fun(&CFoo::compare_with_pointer),&CFoo("Orgelsopp!")));
    if(it != neFooListe.end())
        cout<<"Der Bezeichner ist: "<<(*it)->Bezeichner<<endl;
    else
        cout<<"Ich mach jetzt naemlich mein Jodeldiplom,dann hab ich endlich was eigenes..."<<endl;

    return 0;
}



MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
01.03.2006, 19:32 Uhr
ip



Hoi!

Vielen Dank! Kannte bind2nd (bzw bind1st) und mem_fun garnicht. Was die STL nicht so alles kann... ich glaube Java Programmierer würden die Krätze kriegen, wenn sie dass sehen

Für evtl hier noch drüber stolpernde:

mem_fun Manpage
bind2nd Manpage

Gruesse

Daniel
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
01.03.2006, 19:51 Uhr
Spacelord
Hoffnungsloser Fall



Zitat von ip:
Was die STL nicht so alles kann... ich glaube Java Programmierer würden die Krätze kriegen, wenn sie dass sehen



Yep,ein eingefleischter Javaprogrammierer ist zur Zeit hier im Forum.Und der kriegt die Krätze mit C++ www.fun-soft.de/showtopic.php?threadid=14413.
Sind halt 2 recht unterschiedliche Geschichten.Ich kenne beide Sprachen und ich mag auch beide.C++ ist halt ne LowLevel Sprache die es sich imho nicht erlauben kann zentnerweise Metainformationen mit sich rum zu schleppen.Die Reflectiongeschichte von Java ist im Vergleich zu den kümmerlichen Typinformationen von C++ zwar ne andere Welt,dafür bieten aber im Gegenzug die Templates aus C++ nen riesen Potential ,von dem die Java 5 Generics nur träumen können.

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
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: