Objekt initialisieren mit dem Komma/Gleich Operator



  • Hallo. Ich möchte ein Objekt meiner Listen-Klasse mithilfe vom , und vom = Operator initialisieren. Was ich erreichen möchte, ist folgendes:

    // Wahlweise
    CList<CString> items;
    items = (L"Hallo", L"das", L"ist", L"ein", L"Test");
    // Oder (einfacher)
    CList<CString> items = (L"Hallo", L"das", L"ist", L"ein", L"Test");
    

    In welcher Klasse muss ich dann den Komma-Operator überladen? CList oder CString?

    Ich habe folgendes probiert: (CString.hpp)

    CList<CString> CString::operator,(const wchar_t* str) {
    	CList<CString> list;
    	list.append(*this);
    	list.append(str);
    	return list;
    }
    

    aber das erzeugt nicht den gewünschten Effekt. Ich finde leider auch keine Literatur zu meinem Anliegen.

    Mit freundlichen Grüßen,
    DerCoder


  • Mod

    DerCoder schrieb:

    Was ich erreichen möchte, ist folgendes:

    // Wahlweise
    CList<CString> items;
    items = (L"Hallo", L"das", L"ist", L"ein", L"Test");
    // Oder (einfacher)
    CList<CString> items = (L"Hallo", L"das", L"ist", L"ein", L"Test");
    

    Das ist unmöglich. Ein überladener Operator benötigt mindestens ein UDT als Parameter.



  • Was du willst, ist list-initialization; indem du einen Konstruktor mit std::initializer_list<> als Parameter definierst, oder eben per Zuweisungsoperator:

    /// In der Definition des Klassentemplates sei T dein element_type
    CList( std::initializer_list<T> li )
    {
        insert( li.begin(), li.end() ); // oder eine ähnliche Funktion
    }
    
    ...
    
    CList<CString> items{ L"Hallo", L"das", L"ist", L"ein", L"Test" };
    

    Näheres zu std::initializer_list findest du hier und natürlich im Standard, Kapitel 8.5.4 (und in Verbindung damit natürlich auch 8.5.1).
    Edit: Standard-backup für camper:

    [over.oper]/6 schrieb:

    An operator function shall either be a non-static member function or be a non-member function and have
    at least one parameter whose type is a class, a reference to a class, an enumeration, or a reference to an
    enumeration.



  • camper schrieb:

    DerCoder schrieb:

    Was ich erreichen möchte, ist folgendes:

    // Wahlweise
    CList<CString> items;
    items = (L"Hallo", L"das", L"ist", L"ein", L"Test");
    // Oder (einfacher)
    CList<CString> items = (L"Hallo", L"das", L"ist", L"ein", L"Test");
    

    Das ist unmöglich. Ein überladener Operator benötigt mindestens ein UDT als Parameter.

    Was ist ein UDT?



  • DerCoder schrieb:

    camper schrieb:

    DerCoder schrieb:

    Was ich erreichen möchte, ist folgendes:

    // Wahlweise
    CList<CString> items;
    items = (L"Hallo", L"das", L"ist", L"ein", L"Test");
    // Oder (einfacher)
    CList<CString> items = (L"Hallo", L"das", L"ist", L"ein", L"Test");
    

    Das ist unmöglich. Ein überladener Operator benötigt mindestens ein UDT als Parameter.

    Was ist ein UDT?

    Hättest du googlen können...
    UDT = User Defined Type = Klassen, Templates, Enumerationen, Unions, usw.

    Edit: Bei Google kommt ja gar nichts! 😃 Dann war's nicht deine Schuld.



  • Wie müsste ich den Komma Operator denn überladen?



  • DerCoder schrieb:

    Wie müsste ich den Komma Operator denn überladen?

    Gar nicht, siehe einfach meinen ersten Post hier im Thread bitte.



  • Sone schrieb:

    Edit: Bei Google kommt ja gar nichts! 😃 Dann war's nicht deine Schuld.

    Sone vom feinsten, einfach unveränderlich...



  • Rew. schrieb:

    Sone schrieb:

    Edit: Bei Google kommt ja gar nichts! 😃 Dann war's nicht deine Schuld.

    Sone vom feinsten, einfach unveränderlich...

    Es ist schon frech, etwas zu fragen, wenn man es genauso googlen könnte. Hier ist es völlig in Ordnung, da bei Google eben nichts brauchbares kommt. Schuld hat man sonst aber schon.

    Edit: Scheint mir fast polemisch, so eine Sache gleich als überheblich und arrogant zu erklären.



  • Das meinte ich nicht. Ich meinte das Auf-die-Kacke-Gehaue. Obwohl du dir zugegebenermaßen viel Wissen angeeignet hast, bist du genau so geblieben wie vor 3-4 Jahren. Einfach nur du 🙂



  • Rew. schrieb:

    Das meinte ich nicht. Ich meinte das Auf-die-Kacke-Gehaue. Obwohl du dir zugegebenermaßen viel Wissen angeeignet hast, bist du genau so geblieben wie vor 3-4 Jahren. Einfach nur du 🙂

    3-4 Jahre?!? Ich hab' genau April 2011 angefangen 😃
    Und was meinst du mit Auf-Die-Kacke hauen? Peitscht man die Leute solange aus, bis sie es kapieren, dann klappt es vielleicht irgendwann auch mit Code-Tags. :träum:



  • sone hat schon recht, initializer_list ist genau *das* Mittel der Wahl.

    Ich hoffe, du erstellst die Klassen nur zu Übungszwecken und wechselst zu std::string und std::list (oder einem anderen passenden Container), wenn es ernst wird.



  • CList<CString> items;
    (items, L"Hallo", L"das", L"ist", L"ein", L"Test");
    

    Wenn das für dich in Ordnung ist, musst du folgende Operatoren implementieren:

    CList<CString>& operator,(CList<CString>& list, wchar_t const* s);
    


  • Oder man benutzt user-defined literals.

    Ethon, lass doch den Doofsinn.
    Den Kommaoperator sollte man nie Überladen.



  • Sone schrieb:

    Den Kommaoperator sollte man nie Überladen.

    Sagt wer? Ich lege Einspruch ein.



  • Google C++ Style Guide sagt: Do not overload operators except in rare, special circumstances

    http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Operator_Overloading



  • dd++ schrieb:

    Do not overload operators except in rare, special circumstances

    zwischen "rare special circumstances" und "nie" ist ja nun schon noch ein kleiner Unterschied



  • ...



  • Kellerautomat schrieb:

    Sone schrieb:

    Den Kommaoperator sollte man nie Überladen.

    Sagt wer? Ich lege Einspruch ein.

    Nein, es geht um normalen Endanwendercode. Für solche Template-Bibliotheken wie die von Boost ist es klar, dass da keine Regeln gelt'n :p



  • Sone schrieb:

    Nein, es geht um normalen Endanwendercode. Für solche Template-Bibliotheken wie die von Boost ist es klar, dass da keine Regeln gelt'n :p

    Also wenn boost.assign oder boost.lambda nicht fuer Endanwender ist, dann weiss ich auch nicht.


Anmelden zum Antworten