2012-04-12 15 views
4
unbekannt wollen

Grundsätzlich ich die < < Operator für meine Tokentype-Struktur überlasten müssen, die wie folgt (kann nicht geändert werden, ich habe es auf diese Weise verwenden)eine C++ Vereinigung verwenden, wenn das Mitglied, das Sie ist

struct tokenType 
{ 
    int category ; // one of token categories defined above 
    union 
    { 
     int operand ; 
     char symbol ; // '+' , '-' , '*' , '/' , '^' , '=' 
    } ; 
    int precedence() const ; 
} 

Mein Header für die Überlastung Methode ist: aus dem Wert in der Struktur tk, zu drucken, entweder einen int oder char

ostream & operator<< (ostream & os , const tokenType & tk) 

Also, was ich brauche. Wie kann ich auf das zugreifen, was in der Union enthalten ist, wenn ich nicht weiß, ob die Variable Operand oder Symbol ist? Vielen Dank.

Antwort

5

Was Sie tun müssten, ist der category Mitglied (die nicht Teil der Union ist) zu entscheiden, welche der Union-Elemente zu verwenden. So etwas wie die folgenden könnte nützlich sein (ich bin in der Kategorie Definitionen erraten, natürlich):

switch (tk.category) { 
    case catOperand: 
     os << tk.operand; 
     break; 
    case catSymbol: 
     os << tk.symbol; 
     break; 
} 
2

Da Ihr Bediener einen (konstanten Bezug auf a) tokenType nimmt und das category Mitglied identifiziert, welches Element der Vereinigung aktuell gültig ist, haben Sie die Informationen, die benötigt werden, um es genau zu drucken.

4

Ist das nicht, was die „Kategorie“ Zahl soll andeuten? Das sieht wie ein tagged union aus, wo die Kategorie das Tag ist. Es sollte Ihnen sagen, ob das Token ein Operand oder ein Symbol ist, und Sie können damit entscheiden, auf welches Feld in der Union zugegriffen werden soll.

3

Das int category Bit verrät Ihnen, wie man die union interpretiert. Normalerweise ist dies ein Aufzählungstyp.

Wie auch immer Sie gerade verwenden, um eine switch Anweisung (oder vielleicht, wie Sie nur zwei categorys haben eine if then else ausreichen würde.