Exceptions in Initialization lists
-
Gibt es eine Moeglichkeit in Initialization lists exceptions zu werfen?
Ohne Init lists:
MyClass::MyClass(int x, int y) throw(std::out_of_range) { if(x>=7 || x<=-1) throw std::out_of_range("x is out of range!"); else if(y>=7 || y=-1) throw std::out_of_range("y is out of range!"); else { x_=x; y_=y; } }
Kann man das auch mit Initialization lists machen?
-
MyClass::MyClass(int x) : x(x <= foo ? x : throw bar()) { }
oder sowas könnte gehen, aber ich seh nicht ganz den Sinn
-
Sieht interessant aus.
Was du an dem Sinn nicht verstehst, versteh ich dafuer nicht so ganz...
-
Bashar schrieb:
MyClass::MyClass(int x) : x(x <= foo ? x : throw bar()) { }
müssen bei :? die beiden ausdrücke nicht vom gleichem typ sein?
und was ist denn x( throw bar() )?!
glaube nicht das es so geht.
-
Doch es klappt und zwar deswegen: Wenn der zweiter Fall eintritt wird sofort aus der Funktion hinausgesprungen wird und die Zuweisung des nicht vorhandenen return values wird nie stattfinden
#include <iostream> #include <stdexcept> using namespace std; class MyClass { public: MyClass::MyClass(int x); private: int x_; }; MyClass::MyClass(int x) : x_(x <= 42 ? x : throw std::out_of_range("bla")) { } int main() { try { MyClass m(43); } catch(...) { std::cout << "klappt" << std::endl; } return 0; }
Ist aber n zieeemlich schmutziger hack
-
#include <iostream> #include <ctime> using namespace std; void func( ){} int main( ) { int x = rand() > rand() ? 1 : func(); }
compile-error schrieb:
In function
int main()': \
func()()' has type `void' and is not a throw-expressionkann ich die fehlermeldung so deuten, das bei :? bei beiden ausdrücken der typ gleich sein muss, es sei denn in einem der ausdrücke wird eine exception geschmissen?
man lernt nie aus. das ist ja bei settern sogar ganz praktisch
-
borg schrieb:
kann ich die fehlermeldung so deuten, das bei :? bei beiden ausdrücken der typ gleich sein muss, es sei denn in einem der ausdrücke wird eine exception geschmissen?
Genau.