Operatorenüberladung und/oder automatische Typenumwandlung



  • Tach!

    Mein Anliegen ist folgendes: Ich habe eine Klasse, der mit = ein char* oder eine andere Instanz zugewiesen werden soll, sowie der +-Operator soll definiert werden.

    class NLStream  
    {
    public:
    
      NLStream(int iSize = 1024,int iReAlloc = 1024);
    
      NLStream(char *szString)
      {
        this->SetAlloc(1024,1024);
        this->Store(szString,strlen(szString)+1);
      }
    
      NLStream(const NLStream &rCopy)
      {
        m_iPos = 0;
        m_bBrother = false;
    
        SetAlloc(1024,1024);
        OnBlowfish = NULL;
    
        Store(rCopy.m_acData,rCopy.m_iSize);
      }
    
      NLStream &operator=(const NLStream &rCopy);
      {
        this->Clear();
        this->SetPos(NLS_START);
        this->Store(rCopy.m_acData,rCopy.m_iSize);
        this->SetEnd();
    
        return (*this);
      }
    
    /*NLStream &operator=(char *szStr)
     {
       this->SetPos(NLS_START);
       this->Store(szStr,strlen(szStr));
       this->SetEnd();
    
       return (*this);
     }
    */
    
    /*
    .
    .
    .
    .
    */
    
    };
    
    int main(int argc, char* argv[])
    {
      NLStream stream("bla");
    
      return 1;
    }
    

    gibt mir folgenden Error:

    useful.cpp(29) : error C2664: '__thiscall NLStream::NLStream(int,int)' : cannot convert parameter 1 from 'char [4]' to 'int'

    welchen ich nicht verstehe, da ich eigentlich wollte, dass er den Konvertierungskonstruktor(richtiger Name?) aufruft und nicht den Standartkonstruktur.

    Um mein Problem konkreter zu beschreiben, es soll implementiert sein:
    1. stream = "blabla"
    2. stream = andererNLStream (also Kopierkonstruktor überladen ?)
    3. stream +="blabla"
    4. stream +=andererNLStream...

    ich benutze M$ VC 6.0 und WinXP

    Weiß da jemand Rat? Hänge jetzt schon ne gute Woche an diesen 4 Funktionen 😡

    gruß



  • Dein Konstruktor erwartet einen char * und versuchst ihm einen const char * anzudrehen, das geht nicht... warum er sich dann allerdings nur über das zweite nicht passende beschwert???

    Deklarier jedenfalls mal um zu
    NLStream::NLStream(const char * szString)
    damit müßte es eigentlich gehen.



  • vielleicht auch nur ein copy&paste fehler: ein semikolon nach dem ersten operator=



  • @ Jester:

    Hab ich auch schon probiert....:

    NLStream(const char *szString)
      {
        this->SetAlloc(1024,1024);
        this->Store((char*)szString,strlen(szString)+1);
      }
    

    useful.cpp(29) : error C2664: '__thiscall NLStream::NLStream(int,int)' : cannot convert parameter 1 from 'char [4]' to 'int'
    This conversion requires a reinterpret_cast, a C-style cast or function-style cast

    @ davie: Ja leider bloß ein Paste-Fehler, weil ich den Body in die Definition kopiert hatte..

    gruß



  • Er scheint diesen Konstruktor hier aufzurufen:

    NLStream(int iSize = 1024,int iReAlloc = 1024);
    

    Steht ja auch schon im Fehler, daß beim Aufruf von NLStream(int,int) die Typenumwandlung nicht stattfinden konnte.

    Und wozu hast Du den eigentlich? Selbst wenn er aufgerufen würde, wäre dort nicht einmal weiterer Code, der ausgeführt werden würde...



  • Doch den Code hatte ich bloß nicht gepostet, da der eigentlich funktioniert...

    NLStream::NLStream(int iSize,int iReAlloc)
    {
      this->SetAlloc(iSize,iReAlloc);
    
      m_iPos = 0;
      m_bBrother = false;
      OnBlowfish = NULL;
    }
    

    Also der Standardkonstruktor funktioniert.., aber halt nicht der spezielle für char * 😞

    gruß



  • Nur du siehst ja an der Fehlermeldung, daß er eindeutig den Falschen Kostruktor aufruft...

    Hast Du schon einen

    NLStream(const char * szString)
    

    ausprobiert?
    Immerhin gilt dieser Text zwischen den "" Ja als literal(?)-konstante wenn ich mich recht entsinne!



  • hmm literal sagt mir im Moment gar nichts...

    also ich hab jetzt mal:

    ...
      char szStr[]="bla";
      const char *pStr = szStr;
    
      NLStream stream(pStr)
    ...
    

    selber Fehler.. Desweiteren würde ich das auch gerne so implementieren können, dass ich den CTor mit NLStream("bla") aufrufen kann....

    gruß



  • Arggggggggggghs... Hat sich erledigt... Ein programmiertechnisch unabhängeriger Fehler von mir 😃

    also funktioniert jetzt alles eine letzte Frage hätte ich noch...

    NLStream &operator+=(NLStream &pStream)
      {
        this->Store(pStream.m_acData,pStream.m_iSize);
        this->SetEnd();
        return (*this);
      }
    

    für

    NLStream stream("bl"),
             sndstream("ah");
    
    stream+=sndstream;
    

    hab ich allerdings Zeiger muss ich:

    NLStream *stream = new NLStream("bl"),
                  *sndstream = new NLStream("ah");
    
    (*stream)+=(*sndstream);
    

    schreiben.

    Kann ich jetzt noch irgendwas überladen, um mir das Referenzieren der Pointer zu sparen ??

    gruß



  • Nein.



  • Nstream &operator += (Nstream *a, Nstream *b) { return *a+=*b; }



  • davie schrieb:

    Nstream &operator += (Nstream *a, Nstream *b) { return *a+=*b; }

    Obfuscated C++?



  • Wieso? Eine der wenigen guten Merkmale der C++ Syntax, ist die Möglichkeit sich kompakt auszudrücken.

    (soll man natürlich nicht übertreiben, aber hier ist es doch eindeutig)



  • Shade: ja, da sollte man drauf hinweisen.



  • Wie meinst du das?

    Mal was anderes, wozu muss man das überhaupt erst extra schreiben? Der Compiler könnte das doch automatisch generieren, wenn man eh schon '+' definiert hat.



  • ich mein nur, dass (ein code sagt mehr als 1000 worte)

    NLStream *x = new NLStream, &y = *x; //kurz und bündig
    //folgendes:
    NLstream foo(x += &y);
    

    das ist nicht, was man erwartet.


Log in to reply