operator Fehler



  • Hey ich mal wieder.

    Es geht um diese Funktion:

    unsigned SYSInfo::getName(){ 
      if (dev[0].name == 0) return{};
      return dev[0].name;   
    }
    

    Der Fehler ist:

    keine Übereinstimmung für »operator==« in »((exsystem::SYSInfo*)this)->exsystem::SYSInfo::dev.std::vector<_Tp, _Alloc>::operator[] [mit _Tp = exsystem::face, _Alloc = std::allocator<exsystem::face>, std::vector<_Tp, _Alloc>::reference = exsystem::face&, std::vector<_Tp, _Alloc>::size_type = long unsigned int](0ul).exsystem::face::name == 0«
    

    Zur Funktion, in diesem Fall steht "lo" gespeichert in name und soll geholt werden.

    Bei meiner Funktion:

    unsigned SYSInfo::getBytesr(){ 
      if (dev[0].bytes_received == 0) return{};
      return dev[0].bytes_received;   
    }
    

    funktioniert alles da steht allerdings eine Zahl drin.

    LG Enno



  • Was ist "dev[0].name" für ein Typ?



  • Enno schrieb:

    Hey ich mal wieder.

    Es geht um diese Funktion:

    unsigned SYSInfo::getName(){ 
      if (dev[0].name == 0) return{};
      return dev[0].name;   
    }
    

    😃 Das geht doch nicht. Eine Zeichenkette kann doch nicht Null sein. Oder hast du z.B. schon mal eine Person kennengelernt die Null heißt? Manche Personen sind vielleicht eine Null, aber das ist doch kein Name. Ich denke mal, du willst testen, ob die Zeichenkette leer ist. Dann mach if (dev[0].empty()) return{};



  • daddy_felix schrieb:

    Was ist "dev[0].name" für ein Typ?

    Und was willst du mit "return{}" bewirken?

    Oh, ja die Infos fehlen glaube ich noch:

    std::vector<face> dev
    
    struct face{ 
        std::string name;
    


  • Ach out .... i love u 🤡

    std::string SYSInfo::getName(){ 
      if (dev[0].name.empty()) return{};
      return dev[0].name;   
    }
    


  • sysinfo.cpp:142:43: Warnung: erweiterte Initialisierungsliste nur mit -std=c++0x oder -std=gnu++0x verfügbar [standardmäßig aktiviert]
    

    Weiß jemand Rat zu diesem Fehler? Kommt Bei beiden Funktionen von oben!

    LG Enno



  • std::string SYSInfo::getName(){ 
      if (dev[0].name.empty()) return{};
      return dev[0].name;   
    }
    

    Was ist der Unterschied zu?:

    std::string SYSInfo::getName(){ return dev[0].name; }
    

    Weiß jemand Rat zu diesem Fehler? Kommt Bei beiden Funktionen von oben!

    Ich sehe keinen Fehler, nur eine WARNUNG. Und ich finde die Warnung ziemlich eindeutig.



  • knivil schrieb:

    std::string SYSInfo::getName(){ 
      if (dev[0].name.empty()) return{};
      return dev[0].name;   
    }
    

    Was ist der Unterschied zu?:

    std::string SYSInfo::getName(){ return dev[0].name; }
    

    Ich überprüfe vorher ob name leer ist?



  • knivil schrieb:

    Weiß jemand Rat zu diesem Fehler? Kommt Bei beiden Funktionen von oben!

    Ich sehe keinen Fehler, nur eine WARNUNG. Und ich finde die Warnung ziemlich eindeutig.

    Kann man das ignorieren? oder bekommt man das irgendwie weg?



  • Ja, lesen kann ich. Aber was gibst du zurueck? Also du testest, ob der Name leer ist. Wenn ja, dann gibst du einen leeren String zurueck, wenn nicht dann eben den Namen. Was passiert wenn du einfach nur den Namen zurueckgibst, wenn der Name einmal leer ist und wenn er einmal nicht leer ist? Wie unterscheidet sich das Ergebnis von Variante A im Vergleich zur Variante B?

    Btw. das ist kein Chat ... Bitte lesen, denken, ausprobieren, schreiben, ... in genau dieser Reihenfolge!



  • knivil schrieb:

    Und gibst dann was zurueck?

    0 oder nicht?



  • std::string SYSInfo::getName(){ 
        if (dev[0].name.empty()) return{};
        return dev[0].name;   
    }
    

    das return{} gibt eine Inizializer-List mit 0 Elementen zurück. Was du meinst, ist return "";

    bzw. besser wäre es sogar so:

    const std::string& SYSInfo::getName(){ 
        if (dev[0].name.empty()) 
          return "";
        return dev[0].name;   
    }
    

    da hier der String nicht kopiert werden muss.

    Aber mal etwas nachgedacht, wie sieht ein leerer String aus? genau: "". Du überprüfst also, ob der String leer ist, wenn ja, gibst du "" zurück. sonst den String -> Überprüfung ist redundant. Ergo:

    const std::string& SYSInfo::getName(){ 
        return dev[0].name;   
    }
    


  • Enno schrieb:

    knivil schrieb:

    Und gibst dann was zurueck?

    0 oder nicht?

    Nein, auf raten wuerde ich verzichten! Schon mal deinen Rueckgabewert angesehen? 0 ist eine Zahl und kein std::string.



  • Cyres schrieb:

    bzw. besser wäre es sogar so:

    const std::string& SYSInfo::getName(){ 
        if (dev[0].name.empty()) 
          return "";
        return dev[0].name;   
    }
    

    da hier der String nicht kopiert werden muss.

    Nicht gut, da eine Referenz auf ein lokales temporäres Objekt zurückgegeben wird.



  • Spielt keine Rolle, da const-Referenzen auf temporäre Objekte erlaubt sind. Und die Methode gibt eine const-Referenz zurück => alles gut. Aber das ist ja doch nur die drittbeste Lösung, die zweitbeste hat Cyres ja direkt danach gepostet. Die beste Lösung ist imho

    const std::string& SYSInfo::getName() const
    { 
        return dev[0].name;   
    }
    


  • Warum das erste const und warum das zweite?
    Das ich die Überprüfung nicht brauch hab ich verstanden.



  • DocShoe schrieb:

    Spielt keine Rolle, da const-Referenzen auf temporäre Objekte erlaubt sind.

    Na dann ist es ja gut, dass ich das angesprochen habe. 😃 Wie lange lebt denn das temporäre Objekt?



  • Cyres schrieb:

    das return{} gibt eine Inizializer-List mit 0 Elementen zurück. Was du meinst, ist return "";

    Nein, das gibt einen default-konstruierten String zurück. Ist also nicht falsch (vermutlich allerding eher durch Zufall als durch planmäßiges Vorgehen), aber natürlich trotzdem überflüssig.



  • DocShoe schrieb:

    Spielt keine Rolle, da const-Referenzen auf temporäre Objekte erlaubt sind.

    Die Lebenszeit des referenzierten Objekts wird aber nur für Variablen im lokalen Scope verlängert.

    const int& i = 3; // ok
    


  • DocShoe schrieb:

    const std::string& SYSInfo::getName() const
    { 
        return dev[0].name;   
    }
    

    Kann das bitte noch einmal genau erklärt werden warum die zwei const da stehen?

    LG Enno



  • Kannst du dir vielleicht mal endlich ein Buch kaufen? 🙄


Anmelden zum Antworten