Неявный вызов оператора [C ++] - PullRequest
0 голосов
/ 14 декабря 2009

Я определил два класса:

class Token_
{
public:
    virtual char operator*()const = 0;//this fnc cannot run implicitly
protected:
    Token_()
    {   }
    Token_(const Token_&);
    Token_& operator=(const Token_&);
};

и второй:

class Operator : public Token_
    {
    public:
    Operator(const char ch):my_data_(token_cast<Operator_enm>(ch))
    {   }
    Operator_enm get()const
    {
        return my_data_;
    }
    Operator_enm set(const Operator_enm& value)
    {
        Operator_enm old_value = get();
        my_data_ = value;
        return old_value;
    }
    char operator*()const//this operator has to be invoke explicitly
    {
        return static_cast<char>(my_data_);
    }
private:
    Operator_enm my_data_;
};

и позже в программе у меня что-то вроде этого:

template<class R>
R Calculator::expr_()const
{
    Token_* token = read_buffer_();
    switch (*token)//here if I use explicit call of operator*() it works
    {
    case PLUS:
        {
            R result ;//not defined yet
            return result;
        }
    case MINUS:
        {
            R result ;//not defined yet
            return result;
        }
    default:
        cerr << "Bad expr token.";
    }

}

Почему этот вызов оператора * () не может быть неявным? Есть ли способ сделать это неявным? Спасибо.

Ответы [ 2 ]

5 голосов
/ 14 декабря 2009

token является указателем на объект Token_, а не на сам объект Token_, поэтому оператор * в операторе switch разыменовывает только указатель (таким образом только получая объект), но не затем продолжайте вызывать определенный вами оператор.

Попробуйте вместо:

switch(*(*token)) {

Использование вашего пользовательского operator * может показаться немного запутанным.

Другой вариант - изменить read_buffer_() так, чтобы вы могли делать следующее:

Token_ token = read_buffer_(); // NOTE: read_buffer_() returns a Token_ object directly
switch (*token)//here if I use explicit call of operator*() it works

В этом случае Token_ объекты имитируют указатели, и вы также не сможете вернуть указатель на указатели.

0 голосов
/ 14 декабря 2009

Другой вариант вместо:

Token_* token = read_buffer_();

сделать:

Token_& token = *read_buffer_();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...