Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Fehler mit ostringstream in einer Klasse

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.06.2006, 09:55 Uhr
~ka
Gast


Hi,

ich habe folgenden Code geschrieben, der beim Auslösen einer Exception
("z.B.: throw Entleih_ERROR(12,1)")
eine Fehlermeldung erzeugen soll.

Nur erhalte ich beim kompilieren immer diese Fehlermeldung:

Zitat:
"std::basic_ios<_Elem,_Traits>::basic_ios": Kein Zugriff auf private Member, dessen Deklaration in der std::basic_ios<_Elem,_Traits>-Klasse erfolgte.


Ich verwende MS Visual Studio 2005, falls euch das hilft.

Folgender Code funktioniert nicht:


C++:
#include <string>
#include <sstream>
using namespace std;

class Entleih_ERROR {
    ostringstream fehlertext;

    public:        
        Entleih_ERROR(int signatur, int fehlernr);
        string text() { return fehlertext.str();}
};

Entleih_ERROR::Entleih_ERROR(int signatur, int fehlernr) {
    if (fehlernr) fehlertext << "\nFehler bei der Ruecknahme von Signatur: ";
    else fehlertext << "\nFehler bei der Ruecknahme von Signatur: ";
    fehlertext << signatur << "\n\n";
}



Ändere ich den Code ab, sodass ich das ostringstream-Objekt nur lokal im Konstruktor verwende, dann funktioniert es. Warum auch immer?!


C++:
#include <string>
#include <sstream>
using namespace std;

class Entleih_ERROR {
    string fehlertext;

    public:        
        Entleih_ERROR(int signatur, int fehlernr);
        string text() { return fehlertext;}
};

Entleih_ERROR::Entleih_ERROR(int signatur, int fehlernr) {
    ostringstream s;
    if (fehlernr) s << "\nFehler bei der Ruecknahme von Signatur: ";
    else s << "\nFehler bei der Ruecknahme von Signatur: ";
    s << signatur << "\n\n";
    fehlertext = s.str();
}



Schon mal danke im voraus!!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
01.06.2006, 10:32 Uhr
J-jayz-Z
Perl Crack ala Carte
(Operator)


Wieso schreibst du die Methode außerhalb der Klasse ? Die soll doch wohl Teil der Klasse sein, oder ?
versuchs mal so:


C++:
#include <string>
#include <iostream>
#include <sstream>
using namespace std;

class Entleih_ERROR {
    private:
        ostringstream fehlertext;

    public:
        Entleih_ERROR(int signatur, int fehlernr)
        {
                if (fehlernr) fehlertext << "\nFehler bei der Ruecknahme von Signatur: ";
                else fehlertext << "\nFehler bei der Ruecknahme von Signatur: ";
                 fehlertext << signatur << "\n\n";
        }

        string text() { return fehlertext.str();}
};

int main(int argc, const char* argv[])
{
        Entleih_ERROR* foo = new Entleih_ERROR(1, 1);
        string bar = foo->text();
        cout << bar << endl;
        return 0;
}



Ich hab nur den g++ da, zum testen. Da geht es einwandfrei
--
perl -Mstrict -Mwarnings -e 'package blub; sub new { bless {} } sub bar {my $self=shift; $self->{bla}="66756e2d736f66742e6465"; return $self->{bla};} my $foo=blub->new();print "Hallo ";print pack("H*",$foo->bar()); print "\n"'
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
01.06.2006, 11:53 Uhr
~ka
Gast


Dann wird das wohl am Visual Studio 2005 liegen.
Ist auch nicht so schlimm. Muss ich mich halt mit der Alternative begnügen.


Zitat:
Wieso schreibst du die Methode außerhalb der Klasse ? Die soll doch wohl Teil der Klasse sein, oder ?


Die Methode (der Konstruktor) gehört auch zur Klasse. Das stelle ich mit dem Vorsatz
C++:
Entleih_ERROR::
sicher. Methoden außerhalb der Klasse zu definieren erhöht die Übersichtlichkeit. Klar, bei dieser kleinen Klasse ist das nicht so wichtig.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
01.06.2006, 15:54 Uhr
Tommix



Hallo,

Zitat von ~ka:
Dann wird das wohl am Visual Studio 2005 liegen.


Scheint mir auch so, in VC 6 läuft es genau so, wie Du gepostest hast.

Gruß, Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
01.06.2006, 19:52 Uhr
Spacelord
Hoffnungsloser Fall


Hi,
das Problem vermute ich hinter dem automatisch generierten Copy Konstruktor von Entleih_ERROR.Dieser versucht ne Kopie von dem ostringstream Attribut zu machen was glatt in die Buchse geht weil ostringstream keinen öffentlichen Copy Konstruktor hat.
Um das Problem zu umschiffen müsstest du/man nen eigenen Kopier Konstruktor zur Verfügung stellen.
Etwa so:

C++:
class Entleih_ERROR {
  
        ostringstream fehlertext;
    public:        
        Entleih_ERROR(int signatur, int fehlernr);
        Entleih_ERROR(const Entleih_ERROR& c);
        string text()const { return fehlertext.str();}
};

Entleih_ERROR::Entleih_ERROR(int signatur, int fehlernr):fehlertext(basic_ostringstream<char>()) {
    if (fehlernr) fehlertext << "\nFehler bei der Ruecknahme von Signatur: ";
    else fehlertext << "\nFehler bei der Ruecknahme von Signatur: ";
    fehlertext << signatur << "\n\n";
}

Entleih_ERROR::Entleih_ERROR(const Entleih_ERROR &c)
{
    fehlertext<<c.text();
}



Gruss 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: