Zeigerarrays casten



  • Hallo allerseits,
    Ich hab da ein Problem mit meinem C++ Code, ich hoffe ihr könnt mir weiterhelfen! Also, ich hab 2 Klassen A und B, die je ein Array x, bzw. y von Zeigern auf den Typ X, bzw. Y besitzen:

    class A {
    X** x;
    void f() {macht was mit x}
    }
    
    class B : public A {
    Y** y;
    }
    

    Dabei ist A Basisklasse von B und X Basisklasse von Y.
    Ausserdem enthalten A & B ne Fkt. f die was mit x macht.
    Jetzt möchte ich eigentlich die Funktion f genauso auf das Zeigerarray y wie auf x anwenden können. Am einfachsten wäre es doch wenn ich x = y setzen würde und dann f() aufrufen würde, oder nicht? Weil X Basisklasse von Y ist, sollte das doch eigentlich gehen, hätte ich gedacht... aber mein Compiler weigert sich 😞
    Wenn ich stattdessen schreibe:

    for(alle i) {
     x[i] = y[i];
    }
    

    ...und dann f aufrufe, klappt es. Aber dann muss ich alle Zeiger im Array umkopieren, was is nich so toll finde...

    Kennt jemand einen Ausweg ?

    mfg
    Julius

    [ Dieser Beitrag wurde am 10.06.2003 um 22:41 Uhr von Julius80 editiert. ]



  • X = (X**)Y



  • ach mom das hätte natürlich einen bisschen anderen effekt als das was du geschrieben hast. Das würde heißen X = Y. Dann hätte das die Auswirkung wenn
    du Y = NULL machst is X auch = NULL.



  • class A {
    X** x;
    template<class T>void f(T** _x) {macht was mit _x}
    }

    class B : public A {
    Y** y;
    void f() { A::f( y); }
    }



  • Komisch... müsste sich doch einfach casten lassen.

    class B : public A {
    Y** y;
    void f() { A::f((X**)y); }
    };
    

    Wieso soll das nicht gehn?



  • Oh, geht doch nicht! 🙄
    In der Funktion würde es mit Casten Probleme beim Dereferenzieren geben, weil die Klassengröße ja nicht mehr stimmt.

    (Y** y;)
    X** auch_y = (X**)y;
    auch_y[10][15]; // <- bei [15] geht er dann 15*sizeof(X) weiter statt 15*sizeof(Y)
    


  • C14, auch mal wieder hier ??? 😮


Anmelden zum Antworten