Как перегрузить косвенный оператор? (C++)

Это не завершено, но вот некоторые мысли для вас, чтобы углубиться, если вы придете к этому позже:

    private string CreateWhereClause(Expression<Func<T, bool>> predicate)
    {
        StringBuilder p = new StringBuilder(predicate.Body.ToString());
        var pName = predicate.Parameters.First();
        p.Replace(pName.Name + ".", "");
        p.Replace("==", "=");
        p.Replace("AndAlso", "and");
        p.Replace("OrElse", "or");
        p.Replace("\"", "\'");
        return p.ToString();
    }

    private string AddWhereToSelectCommand(Expression<Func<T, bool>> predicate, int maxCount = 0)
    {           
        string command = string.Format("{0} where {1}", CreateSelectCommand(maxCount), CreateWhereClause(predicate));
        return command;
    }

    private string CreateSelectCommand(int maxCount = 0)
    {
        string selectMax = maxCount > 0 ? "TOP " + maxCount.ToString() + " * " : "*";
        string command = string.Format("Select {0} from {1}", selectMax, _tableName);
        return command;
    }
9
задан 20 May 2009 в 23:14
поделиться

2 ответа

Вы перегрузили оператор умножения. Выньте параметр, чтобы сделать его оператором косвенного обращения.

template<class T>
T list<T>::iterator::operator*()
{
    return ((this->lstptr)->current)->data;
}

Вы также должны заставить его возвращать ссылку, если вы хотите, чтобы код типа * IT = 3; компилировался.

template<class T>
T& list<T>::iterator::operator*()
{
    return ((this->lstptr)->current)->data;
}
14
ответ дан 4 December 2019 в 10:05
поделиться

У вас здесь две проблемы; во-первых, вы случайно перегрузили оператор умножения, а не оператор разыменования; во-вторых, вы не вернули ссылочный тип.

Первая проблема возникает из-за количества параметров. Каждая нестатическая функция-член класса имеет дополнительный «скрытый» параметр: this . this , конечно же, указатель на объект, для которого функция вызывается. В результате вы фактически объявили версию оператора с двумя параметрами. Удалив второй параметр итератора и работая с this , вы перегрузите унарный * , а не двоичный.

Вторая проблема - это второстепенная проблема возвращаемого типа; вы возвращаете копию исходному объекту, а не сам исходный объект. Объявите возвращаемый тип как T & , чтобы вернуть ссылку.

7
ответ дан 4 December 2019 в 10:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: