2017-10-13 8 views
-5

私はlexer.hというヘッダファイルを与えられていて、それはTokenというクラスをあらかじめ定義しています。しかし、私はコンストラクタを理解していません。例えば、TokenType = T_ID、lexeme = "this"、lnum = 2というトークンのインスタンスを作成するにはどうすればよいですか?ありがとう!この定義が与えられたクラスのインスタンスを作成する方法

#ifndef LEXER_H_ 
#define LEXER_H_ 

#include <string> 
#include <iostream> 
using std::string; 
using std::istream; 
using std::ostream; 

enum TokenType { 
     // keywords 
    T_INT, 
    T_STRING, 
    T_SET, 
    T_PRINT, 
    T_PRINTLN, 

     // an identifier 
    T_ID, 

     // an integer and string constant 
    T_ICONST, 
    T_SCONST, 

     // the operators, parens and semicolon 
    T_PLUS, 
    T_MINUS, 
    T_STAR, 
    T_SLASH, 
    T_LPAREN, 
    T_RPAREN, 
    T_SC, 

     // any error returns this token 
    T_ERROR, 

     // when completed (EOF), return this token 
    T_DONE 
}; 

class Token { 
    TokenType tt; 
    string  lexeme; 
    int  lnum; 

public: 
    Token(TokenType tt = T_ERROR, string lexeme = "") : tt(tt), lexeme(lexeme) { 
     extern int lineNumber; 
     lnum = lineNumber; 
    } 

    bool operator==(const TokenType tt) const { return this->tt == tt; } 
    bool operator!=(const TokenType tt) const { return this->tt != tt; } 

    TokenType GetTokenType() const { return tt; } 
    string  GetLexeme() const { return lexeme; } 
    int    GetLinenum() const { return lnum; } 
}; 

extern ostream& operator<<(ostream& out, const Token& tok); 

extern Token getToken(istream* br); 


#endif /* LEXER_H_ */ 
+3

あなたは本当に[良い本](https://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)を読む必要があるようです。 – Rakete1111

答えて

0

外部変数からlnumを初期化するため、このクラスはちょっとファンキーです。それは本当にコンストラクタの引数から来るべきです。しかし、それはそれがその方法なので、lineNumberの値を設定する以外に、それを制御することはできません。これはおそらく意図されたものではありません。その値はおそらく入力が処理されているところから来て、新しい行ごとにインクリメントされます。

だから、その型のオブジェクトを作成するには、ちょうどそれを行う:

Token t(T_ID, "this"); 
1

型トークンのオブジェクトがあるため、コンストラクタでデフォルト引数の3通りの方法で作成することができます。

Token A(T_ID, "this"); 
Token B(T_STRING); 
Token C; 

後者の2つは、コンストラクタで定義されたメンバー変数を持ちます。

関連する問題