2012-12-09 8 views
5

sagen, dass ich die folgenden Klassen:Kann ich einem Mitglied einer Basisklasse in einer abgeleiteten Klasse einen Alias ​​zuweisen?

template <class T> 
class Base { 
    protected: 
    T theT; 
    // ... 
}; 

class Derived : protected Base <int>, protected Base <float> { 
    protected: 
    // ... 
    using theInt = Base<int>::theT;  // How do I accomplish this?? 
    using theFloat = Base<float>::theT; // How do I accomplish this?? 
}; 

In meiner abgeleiteten Klasse möchte ich Base::theT mit einem intuitiveren Namen hinweisen, dass mehr Sinn in der abgeleiteten Klasse. Ich benutze GCC 4.7, das eine ziemlich gute Abdeckung von C++ 11 Funktionen bietet. Gibt es eine Möglichkeit, eine using-Anweisung zu verwenden, um diese Art von wie ich in meinem obigen Beispiel versucht, zu erreichen? Ich weiß, dass in C++ 11 das Schlüsselwort using verwendet werden kann, um Alias-Typen sowie z. Bringen Sie geschützte Basisklassenmitglieder in den öffentlichen Bereich. Gibt es einen ähnlichen Mechanismus für das Aliasing eines Mitglieds?

+4

Ich denke, Sie brauchen entweder Referenzen oder wahrscheinlich eher eine Funktion, die nicht Platz in der abgeleiteten Klasse belegen wird. : | – Xeo

+0

Danke, Referenz funktioniert. –

Antwort

6

Xeos Tipp funktionierte. Wenn Sie mit C++ 11, können Sie die Aliasnamen erklären, wie so:

int &theInt = Base<int>::theT; 
float &theFloat = Base<float>::theT; 

Wenn Sie nicht C++ 11, ich glaube, Sie auch sie im Konstruktor initialisieren können:

int &theInt; 
float &theFloat; 
// ... 
Derived() : theInt(Base<int>::theT), theFloat(Base<float>::theT) { 
    theInt = // some default 
    theFloat = // some default 
} 

EDIT: Die leichte Belästigung ist, dass Sie den Wert dieser Alias-Mitglieder nicht bis zum Hauptteil des Konstruktors (dh innerhalb der geschweiften Klammern) initialisieren können.

+3

Beachten Sie, dass dies die Größe der abgeleiteten Klasse um 'sizeof (void *)' multipliziert mit der Anzahl der Referenzen erhöht. Deshalb habe ich den Vorschlag einer einfachen Getter-Funktion mit dem Namen 'theXXX' eingefügt. – Xeo

+0

Ja, ich nehme an, Sie haben Recht. Glücklicherweise glaube ich nicht, dass zusätzliche 8 Bytes mich töten werden, da ich nicht viele Instanzen der abgeleiteten Klasse habe, so dass ich bei der leichteren Referenzversion bleiben kann, wenn ich auf das Datenelement zugreife. –

Verwandte Themen