Exception-Klasse als Vorwärtsdeklaration?
-
Hallo zusammen,
ich habe versucht, in einer Header-Datei eine Exception-Klasse aus einer anderen Datei per Vorwärtsdeklaration bekannt zu machen, damit eine Methode darin diese Ausnahme werfen kann. Der gcc meckert, sobald ich das "throw" an die Methode anhänge, mit einer Fehlermeldung; statt dessen muss ich die komplette Header, in der die Exception-Klasse deklariert ist, einbinden, was ich vermeiden wollte.
Ich sehe jedoch keinen prinzipiellen Unterschied darin, eine Klasse bekannt zu machen, um z.B. einen Pointer drauf zeigen zu lassen, und der Ankündigung einer Methode, eine solche Ausnahme werfen zu können. In beiden Fällen wird doch weder ein Objekt erzeugt noch auf Methoden zugegriffen?
In den cpp-Files sind alle Header dann drin.
Wo liegt die Ursache?
Gruß, min
So etwa sieht das aus:
[cpp]// foo.h: class MyException { private: string text; public: MyException( const string& text_ ); ~MyException( ); }; // bar.h: // Vorwärtsdeklaration: class MyException; class AndereKlasse { ... void heikleMethode( ) [i]throw MyException;[/i] };[/cpp]
-
minastaros schrieb:
In beiden Fällen wird doch weder ein Objekt erzeugt noch auf Methoden zugegriffen?
Was denkst du, was passiert, wenn eine Exception geworfen wird? Genau, es kommt zur Konstruktion eines Objekts.

Das siehst du ja auch bei den Standard-Exceptions, schliesslich rufst du da den Konstruktor auf:
throw std::runtime_error("Laufzeitfehler");
-
Ich denke mal, dass es ihm nicht um das eigentliche throw geht, wo er ein Objekt wirft, sondern um die Ausnahmespezifikation.
Und warum das nicht geht:
ISO/IEC 14882 15.4/1 schrieb:
A type denoted in an exception-specification shall not denote an incomplete type.
btw:
MSVC++ 08 unterstützt das Feature sowieso nicht..
http://msdn.microsoft.com/de-de/library/skce93f2(en-us,VS.80).aspx
-
Lass die Spezifikation ganz weg und schreib in die Doku bzw. die Kommentare zur Methode, dass diese Exception fliegen kann. Es gibt eine Handvoll Gründe, warum man in C++ nur selten Exceptionspezifikationen verwendet.
-
Hallo Nexus,
drakon hat recht, in der Header geht es ja nur um die Ankündigung, dass die Exception fliegen kann. Der eigentliche Aufruf ist dann in der Implementierung in bar.cpp, und dort ist natürlich auch #include "foo.h" komplett mit drin.
Mir ging es darum, so viel wie möglich über Vorwärtsdeklarationen abzudecken, also alles, was nur als Pointer oder Referenz oder Funktionsparameter in der Header steht. Daher ist es eigentlich logisch, dass eine Exception-Ankündigung auf die gleiche Weise bekannt gemacht werden können sollte (was'n Satz
)Werde mich daher an pumuckl halten und das Ganze im Kommentar beschreiben, denn wenn ich das throw hier im Header weglasse, funktioniert es ja (also der eigentliche Exception-Wurf später in heikleMethode( ) ).
Danke auf jeden Fall für den Hinweis auf die ISO, das erklärt das Ganze zumindest nach dem "Buchstaben des Gesetzes".
Gruß, min
-
pumuckl schrieb:
Es gibt eine Handvoll Gründe, warum man in C++ nur selten Exceptionspezifikationen verwendet.
Wenn ich mich recht erinnere, dann werden die in diesem Artikel zum Teil genannt:
http://www.gotw.ca/publications/mill22.htm-> Interessante Lektüre

Grüssli