1
zu erben

Ich denke, meine Frage ist einfach und klar:Wie Überlastung richtig Umwandlung von Basisklasse

I Basisklasse AbstractMatrix haben, und Unterklasse davon Matrix, und ich möchte einfache Umwandlung machen:

namespace mtrx { 
/* mycode */ 
    class AbstractMatrix { 
     public: 
     /* -//- */ 
     operator Matrix(); 
     /* -//- */ 
    } 
    class Matrix : public AbstractMatrix { 
    /* -//- */ 
    } 
} 

AbstractMatrix.cpp:

AbstractMatrix::operator Matrix(){ 
    return Matrix(data); 
} 

Compiler gibt Nachricht:

Matrix.h:39:12: error: expected type-specifier before ‘Matrix’ 
    operator Matrix(); 
      ^

Was mache ich falsch? Ist es möglich, solche Konvertierungen vorzunehmen? Ich denke ja, denn ich Konstruktor nur machen wollen, basierend auf übergeordnete Klasse, aber ohne langweilig Syntax und ich brauche es implizite

Danke

+0

Ich bin mehr neugierig, warum Sie das tun müssen? Was ist das Problem, das der Bediener lösen soll? Kannst du nicht eine virtuelle "Getter" -Funktion haben, die einen 'AbstractMatrix'-Zeiger zurückgibt? Oder vielleicht [CRTP] (https://en.wikipedia.org/wiki/Curiously_recurring_template_pattern), um die Kindklasse zu kennen? –

+2

Was Ihr Problem betrifft, wissen Sie *, dass Symbole deklariert werden müssen (oder manchmal sogar definiert werden) * bevor * Sie die Symbole verwenden? –

+0

zum Beispiel für foo (Matrix A); Wenn ich etwas wie dieses foo (B) mache, wo B Abstraktmatrix ist, würde B zu Matrix-Klasse konvertiert werden. Danke für den Rat, ich habe vor kurzem begonnen, C++ zu lernen, und ich werde über virtuelle Funktionen und CRTP lesen, vielleicht hilft es mir. – verganz

Antwort

5

Sie einfach eine Vorwärtsdeklaration bieten sollte:

namespace mtrx { 

    class Matrix; // <=== here 

    class AbstractMatrix { 
     public: 
     operator Matrix(); 
    }; 

    class Matrix : public AbstractMatrix { 

    }; 

} 

machen Matrix sichtbar für AbstractMatrix Klasse.


P.S. Sie sollten Ihr Design wahrscheinlich überdenken, denn ein Konvertierungsoperator zum Konvertieren der Basisklasse in abgeleitete Klasse sieht für mich seltsam aus.

+0

Oh, ich habe versucht, es über Namespace zu tun. Über Design ja, ich denke deine Bemerkung ist angebracht, aber es ging eher darum, warum es nicht funktioniert – verganz

Verwandte Themen