2009-04-14 6 views
4

Wenn ich eine Klasse, die eine Anzahl von typedef ‚d Variablen enthält, etwa so:TypeDef als überwindbare Klasse Feature

class X { 

typedef token TokenType; 

bool doStuff() 
{ 
TokenType data; 
fillData(&data); 
return true; 
} 

}; 

Gibt es eine Möglichkeit, die typedef für TokenType in einer abgeleiteten Klasse außer Kraft zu setzen?

N.B. Dies ist kein guter Ort, Vorlagen zu verwenden (Dies ist bereits eine Templat-Klasse und alle Änderungen sind wahrscheinlich in führen [EDIT: unendlich] rekursive Definitionen [class X < class Y = class X < class Y . . .> > etc.].)

Antwort

8

Was können Sie tun, ist Schatten , aber nicht überschreiben. Das heißt: Sie können eine abgeleitete Klasse Y mit eigenen typedefs für TokenType definieren, die aber nur dann zum Tragen kommt, wenn jemand Y :: TokenType direkt oder über ein statisch als Y eingegebenes Objekt referenziert. Jeder Code, der X :: TokenType statisch referenziert wird dies auch für Objekte vom Typ Y tun.

3

Typedefs werden zur Kompilierzeit aufgelöst - sie zu überschreiben wäre bedeutungslos, da das Überschreiben eine Eigenschaft von Laufzeit Polymorphie ist.

Einfach neu deklarieren der Typdef funktioniert - obwohl ich nicht sicher bin, warum Sie denken, Vorlagen wären hier eine schlechte Idee - rekursive Vorlagen sind tatsächlich machbar.

+0

Sorry, verpasste das Wort unendlich aus meinem rekursiven Template-Satz. Diese gesamte Klasse ist ein Problem für ein unendlich rekursives Template-Problem, daher ist es nicht möglich, diesen Typ als Template-Argument hinzuzufügen. Schade, Schablonen wären der beste Weg, damit umzugehen. –

+0

Ok, unendliche Rekursion könnte ein Problem sein. ;-) –

0

Kurze Antwort: Nein, Sie können typedefs nicht überschreiben.

Lange Antwort: Ein typedef ist im Grunde ein Alias ​​oder ein Synonym für einen anderen Typ. Sie definieren keine neuen Datentypen. Sie bieten einfach eine Möglichkeit, einem Typ einen neuen Namen zu geben.