Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » Rätselecke » 1. Montagsrätsel

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 < [ 2 ]
000
14.10.2002, 13:24 Uhr
will_cpp_master_werden



Hi, da ich meine 100 Postings zusammen bekommen muss, hier ausnahmsweise mal ein Montagsrätsel. - Für C++ Newbees

1. Warum muß man beim Copy Constructor mit Referenzen arbeiten?

2. Warum sollte man beim Zuweisungsoperator eine Konstante Referenz zurückgeben?

3. Welche Routinen/Methoden müssen wirklich alle exeptions fangen, dh welche Methoden dürfen nie eine Exception werfen? Begründiung?
--
mfg will_cpp_master_werden (aka virtual)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
14.10.2002, 15:33 Uhr
~0xdeadbeef
Gast


1. Bei der Wertübergabe eines Objekts wird die Klasse kopiert, dabei wird der Copy-Konstruktor aufgerufen. Man geriete also in eine Endlosschleife
2. Konstant mehr so Geschmackssache. Es passiert aber sehr selten, dass du einem Objekt zweimal in einem Statement einen Wert zuweisen willst, von daher ist das meistens ok. Eine Referenz übergibt man, um Rechenzeit zu sparen, weil sonst wieder der Copy-Konstruktor aufgerufen würde.
3. Wenn main eine wirft, bricht das Programm ab Scherz beiseite, Destruktoren, wenn mich nicht alles täuscht.

Grüße,

0xdeadbeef
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
14.10.2002, 16:24 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat:
~0xdeadbeef postete
1. Bei der Wertübergabe eines Objekts wird die Klasse kopiert, dabei wird der Copy-Konstruktor aufgerufen. Man geriete also in eine Endlosschleife



Ack.


Zitat:
2. Konstant mehr so Geschmackssache. Es passiert aber sehr selten, dass du einem Objekt zweimal in einem Statement einen Wert zuweisen willst, von daher ist das meistens ok. Eine Referenz übergibt man, um Rechenzeit zu sparen, weil sonst wieder der Copy-Konstruktor aufgerufen würde.


Leider nicht ganz. Allerdings habe ich dazu noch keine Abschliessende Meinung, ob ein const wirklich sinnvoll ist, oder nicht sogar schädlich. Was man mit einem const vermeiden kann sind solche und andere Dinge:

C++:
(a=b)=c;

Allerdings habe ich läuten hören, dass manche STL Container eine nicht-const Referenz als Rückgabewert erfordern, jedoch weiss ich dazu noch nix näheres. Werde mich mal informieren müssen...


Zitat:
3. Wenn main eine wirft, bricht das Programm ab Scherz beiseite, Destruktoren, wenn mich nicht alles täuscht.


Stimmt. Die Frage ist a´ber: Wraum darf man nicht in dtoren werfen.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
14.10.2002, 21:39 Uhr
void*
Generic Pointer
(Operator)


Hallo!


Zitat:

Warum darf man nicht in dtoren werfen?



Während einer Ausnahmebehandlung darf ein Destruktor keine Ausnahme werfen, denn ansonsten wird std::terminate() aufgerufen (falls die Ausnahme aus dem dtor hearuskommt). Darum: Wenn ein dtor Funktionen aufruft die Ausnahmen werfen sollten die auch gefangen werden.

Gruß
void*
--
Gruß
void*

Dieser Post wurde am 14.10.2002 um 21:40 Uhr von void* editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
15.10.2002, 17:05 Uhr
virtual
Sexiest Bit alive
(Operator)


Das eine Exception im Exception handler zum Problem wird, ist offenkundig. Die Frage war vielmehr, warum eine Exception von einem dtor ein Problem ist.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
15.10.2002, 17:50 Uhr
~0xdeadbeef
Gast


Wahrscheinlich werden am Ende alle Objekte ordnungsgemäß destruiert, so dass, wenn duch den Aufruf eines Destruktors eine Exception auftritt, das Programm abbricht, was den Destruktor erneut aufruft, erneut zu einer Exception führt, was dazu führt, dass das Programm abbricht und so weiter.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
15.10.2002, 19:02 Uhr
void*
Generic Pointer
(Operator)


Eben nicht...da wird gar nichts mehr zerstört. Das Programm bricht einfach ab.
--
Gruß
void*
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
15.10.2002, 19:07 Uhr
~0xdeadbeef
Gast


Und der Speicher wieder freigegeben. Wo ist dann das Problem?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
15.10.2002, 19:51 Uhr
void*
Generic Pointer
(Operator)


Bloss weil Windows RESSOURCEN wieder freigibt, heisst das nicht das jedes OS das tut. Denn Dtoren werden NICHT aufgerufen. Ausserdem wird auch Windows geteilte Ressourcen bestimmt nich freigeben, sondern nur den vom Prozess belegten Speicher und ggf. Handles die dem Prozess direkt zugeordnet werden können. Guter Programmierstil ist das bestimmt nicht. Und ausserdem: Willst Du nicht die Kontrolle haben, wenn eine Exception fliegt, anstatt gezwungen zu werden das Programm zu beenden? Bloss weil eine Exception fliegt heisst das noch lange nicht, dass das Programm in keinen wohldefiniert Zustand überführt werden kann.
Das alles sind für mich Probleme.
--
Gruß
void*
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
15.10.2002, 21:57 Uhr
virtual
Sexiest Bit alive
(Operator)


Also nur weil eine Exception im dtor geworfen wird, stürzt ein Programm nicht zwingend ab, was folgender Code beweist:

C++:
#include <iostream>

class X
{
public:
    virtual ~X() { throw "Hallo"; };
};

int main()
{
    try
    {
        X* x = new X;
        delete x; // dtor hier
    }
    catch(...)
    {
    }

    std::cout << "Normales Program Ende" << std::endl;  
}


Das Problem mit Exceptions im Destructor ist einfach, dass es dadurch unmöglich wird, exceptionsicheren Code zu schreiben (das dabei das eine oder Resource-Leak entsteht, ist natürlich auch so). Unter www.gotw.ca, findet man dazu sehr gute und prägnante Beispiele.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ Rätselecke ]  


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: