2016-04-04 3 views
-1
enum symbol {Number, Letter, Open_Bracket, Closed_Bracket, Unknown} 

    struct token { 
    string s; 
    symbol v; 
    }; 

Теперь я хочу написать функцию, которая возвращает false, если токен t неизвестен. Я пробовалОперанд между токеном и перечислением типа

bool check(token &t) 
if (t == Unknown) 
return false; 

Но я знаю, что это неправильно, потому что t является токеном, а Unknown - символом. Как я могу сделать их одного типа?

я не могу использовать точечную нотацию, потому что, если я использую

if (t.v == Unknown) return false; 

Я получаю это сообщение

multiple definition of 't' 

(я забыл, прежде чем добавить параметр функции.)

+3

вы имели в виду, чтобы написать 'если (t.symbol == Неизвестный) '? –

ответ

4

Вы можете получить доступ к определенным элементам структуры с помощью оператора ., например, этого

if(t.v == Unknown) return false

Как было предложено в комментариях, вы также можете изменить свою структуру и добавить функцию, возвращающую значение типа boolean.

struct token { 
    string s; 
    symbol v; 
    bool checkUnknown(){ 
     return v == Unknown; 
    } 
}; 

И тогда вы можете сделать

if(t.checkSymbolUnknown()) return false; 
+0

Кроме того, вы можете определить метод, который выполняет именно это, что поможет вашему дизайну в целом. Пример: bool check_unknown() const { return v == Неизвестно; } – SenselessCoder

+0

@SenselessCoder: 'isUnknown' будет лучше. –

+0

Возможно, вы правы. В дизайне наименования - большая проблема, чем придумать алгоритм/код: P – SenselessCoder

3

Если у вас есть C++ 11 компилятора, я бы рекомендовал использовать Scoped enumerations:

enum class symbol {Number, Letter, Open_Bracket, Closed_Bracket, Unknown}; 

struct token { 
    string s; 
    symbol v; 
}; 

// ----- 

if (t.v == symbol::Unknown) 
    return false; 
Смежные вопросы