C++: Удобный способ получить доступ к оператору [] из класса?

Я думаю, что когда-либо вы это сделаете, это будет связано с множеством условных утверждений. Но для отдельных операций, например, в ваших примерах, вы можете ограничить это до 4 операторов с чем-то вроде

String math = "1+4";

if (math.split("+").length == 2) {
    //do calculation
} else if (math.split("-").length == 2) {
    //do calculation
} ...

. Это становится намного сложнее, если вы хотите иметь дело с несколькими операциями типа «4 + 5 * 6 ".

Если вы пытаетесь построить калькулятор, я бы перегружал каждую секцию вычисления отдельно (каждый номер или оператор), а не как одну строку.

36
задан A. Rex 3 March 2009 в 13:46
поделиться

5 ответов

(*this)[bar];

хорошо работает для меня.

54
ответ дан Evan Teran 23 September 2019 в 22:33
поделиться

Используйте

(*this)[bar]

для вызова operator[] из объекта экземпляра.

this[bar] обработки this указатель как массив и индексы bar-th элемент того массива (возвращающий ссылку вероятного недопустимого объекта).

3
ответ дан Mr Fooz 23 September 2019 в 22:33
поделиться

Я использую в () функция и имею оператор [], звонят в () функция негласно, таким образом, оператор [] является просто синтаксическим сахаром. Это то, как станд.:: вектор делает это, таким образом, это походит на разумное (с приоритетом) способ сделать это.

Теперь для полного синтаксического сахарного взлома (не может сказать, я полностью рекомендую это, но мог бы ударить Ваше воображение):

class Widget
{
    Widget&     self;
public:
    Widget() :self(*this)
    {}

    void operator[](int)
    {
        printf("hello");
    }

    void test()
    {
        //scripting like sugar
        //you pay the price of an extra reference per class though
        self[1]; 
    }
};


int main(int argc, char* argv[])
{
    Widget w;
    w[1];
    w.test();
    return 0;
}

Также, если Вы хотите сделать, это бесплатно, не оплачивая стоимость ссылки, И является подписчиком некоторой злой секты, выделенной тому, чтобы заставлять программистов пострадать, Вы могли сделать:

#define self (*this)

На самом деле я думаю, что это - то, как большинство дескрипторов реализовано в API NS Apple...

3
ответ дан Robert Gould 23 September 2019 в 22:33
поделиться

Альтернатива (*this)[bar] должна использовать именованную функцию членства, которая делает работу operator[]. Перегруженные операторы делают вещи легче на Ваших пользователях. Что еще более важно, они - часть интерфейса Вашего класса . Спросите себя, если действительно имеет смысл реализовывать Ваш класс с точки зрения своего собственного открытого интерфейса. В противном случае я предлагаю писать отдельное (защищенный или частный) функция членства, чтобы сделать работу и затем иметь operator[] и любой другой вызов функции это.

3
ответ дан Michael Kristofik 23 September 2019 в 22:33
поделиться

Вы могли использовать (*this) [панель] , но это не могло бы быть большой частью улучшения...

1
ответ дан Drew Hall 23 September 2019 в 22:33
поделиться
Другие вопросы по тегам:

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