[C++] i rzucanie wyjątkiem

0

Witam
Tworzę hierarchię wyjątków no i napsiałem (mniej więcej) coś takiego

#include <stdio.h>

class EEx
{
    public:
    EEx& Add() {return *this;}
};

class  : public EEx {};

int main()
{
    try
    {
        throw F().Add().Add();
    }
    catch(F)
    {
        printf("fgfdg");
    }
    return 0;
}

metoda Add musi zwracać typ obiektu dla jakiego została wywołana (żeby stworzyć łańcuch wywołań). Niestety program wywala się. Nie mam pojęcia co zrobić żeby to naprawić a nie chcę rezygnować ze zwracania referencji do obiektu. Może ma ktoś jakiś pomysł jak to obejść ?
Pozdrawiam.

0

Za cholerę nie wiem, co chcesz uczynić, ale na pewno odbieraj wyjątek w catch przez referencję: catch(F& wyjatek). A ta funkcja Add, to w tej chwili przecież nic nie robi... :|

0

Ranides, to nie jest właściwy kod tylko mniej więcej problem z jakim się zmagam. Ten co pisze ma kilkaset linii więc raczej nie będe go wklejał.
na razie wykombinowałem coś takiego:
template<typename T> class EEx
{
public:
EEx() {}
T& Add() {printf("OK"); return ((T)this);}
};

class F : public EEx<F> {};
Niby działa ale rzutowanie dynamic_cast nie chciało się skompilować a użycie zwykłego jest troche niebezpoieczne. Nie mam pewności że jak tą klase zmodyfikuje to mi się program nie wysypie. Jeżeli ktoś ma informacje na ten temat to proszę o odpowiedź.
pozdrawiam.

0

Dobra, ja nie wiem o co kaman.... Może zrób ją virtualną po prostu? A do zidentyfikowania typu obiektu to typeid(typ|zmienna).name().

0

Mi chodzi wyłącznie o wygodę. Mam wyjątek, w którym musze dodać pare informacji. Następnie ma on być złapany, informacje odczytane. Mógłbym to zrobić tak, że najpierw tworze obiekt wyjątku, potem dodaje te informacje, np:
EEx e;
e.Add(info1);
e.Add(info2);
e.Add(info3);
throw e;
Ale to mało wygodne więc lepiej by to zapisać tak throw EEx().Add(info1).Add(info2).Add(info3); Żebym tak mógł zrobić metoda Add musi zwracać referencje do samego siebie. Wszystko jest w porządku gdy mam tylko jedną klase wyjątku. Natomiast musze zrobić pare różnych typów wyjątków, które dziedziczą po EEx. Jeżeli po prostu odziedzicze po EEx to program mi się wysypuje. Sztuczka z templatem działa ale cholera wie czy mi się kiedyś nie sypnie.

0

Wywal te template'y i zrób najzwyczajniejszą klasę. Funkcję Add zrób wirtualną. W dowolnej klasie pochodnej możesz sobie napisać nową wersję funkcji Add (też oczywiście wirtualną) w której też zwracaj po prostu this.

I no problem. Kompilator sam o wszystko zadba.

1 użytkowników online, w tym zalogowanych: 0, gości: 1