Binäre Funktion / Prädikat: (mir fällt kein gescheiter titel ein)



  • Also ich wollte wie schon geschrieben eine Find Methode für eine List-Klasse programmieren. Jetzt habe ich es soweit das der Find Methode folgende Struktur übergeben werden kann:

    template<class T> struct binary_function 
    {
    };
    

    Damit ist die Methode sozusagen allgemeingültig. Jetzt speicher ich Personen in der Liste und möchte anhand des Vornamens eine Person finden:

    template<class C> struct Name : binary_function<C> 
    {
    	string name;
    	bool operator()(const C &P1) const {return (name == P1.firstName); }
    };
    

    Das ganze wird an die Find-Methode übergeben was auch klappt:

    Name<Person> s;
    		s.name = "Hans";
    		Liste.Find(s);
    

    Allerdings sind in der Find-Methode die Attribute der Struktur "Name" unbekannt, d.h. er kennt nur die Attribute der Oberklasse "binary_function" (also gar keine).

    Somit erhalte ich hier auch immer eine Fehlermeldung:

    if(Struktur(iterator)) / wenn der iterator auf eine Person mit dem Namen zeigt, welcher in der Struktor definiert wurde */
       return(iterator); // liefer ihn zurück
    

    Ausdruck ergibt keine Funktion

    Wie kann ich das verhindern?



  • Wenn etwas unklar ist dann fragt ruhig 🙂



  • KleinesRotes schrieb:

    Wenn etwas unklar ist dann fragt ruhig 🙂

    Wie sieht die Deklaration von Find aus?



  • Hier der komplette relevante Code:

    (Alle Variablennamen sind noch Platzhalter)

    template<class T> struct binary_function 
    {
    };
    
    //-----------------------------------------------------------------------------------------//
    
    template<class C> struct Name : binary_function<C> 
    {
    	string name;
    	bool operator()(const C &P1) const {return (name == P1.firstName); }
    };
    
    //-----------------------------------------------------------------------------------------//
    
    template<class T> T List<T>::Find(binary_function<T> Struktur)
    {
    	for(List<T>::iterator itTemp = Begin(); itTemp != End(); ++itTemp)			
    		if(Struktur(itTemp.node->element))  // noch unelegant
    			return(itTemp.node->element);
    }
    
    //-----------------------------------------------------------------------------------------//
    
    // Aufruf
    Name<Person> s;
    s.name = "Hans";
    Liste.Find(s);
    


  • Das kann nicht der einzige Fehler sein...

    Find sollte eine Referenz auf Struktur bekommen. Ansonsten wird eine Kopie angelegt vom Typ binary_function<T> und die Klasse ist leer.

    Allerdings kannst Du so noch nicht Struktur() aufrufen, denn Deine binary_function<T> hat kein operator(). Und wenn sie ihn hätte, dann willst Du aber den operator() von der Oberklasse aufgerufen haben. Also müsste der operator() virtuell sein...

    Die STL arbeitet an der Stelle aber ein bisschen anders...



  • [quote="KleinesRotes"]Hier der komplette relevante Code:

    template<typename T>
    class List
    {
    
    //...
    public:
    
      template<typename U>
      Find(U Struktur)
      {
        for(iterator itTemp = Begin(); itTemp != End(); ++itTemp)		
          if(Struktur(itTemp.node->element))  // noch unelegant
            return(itTemp.node->element);
      }
    //...
    
    };
    

Anmelden zum Antworten