QMenu * << QAction * - Помогите мне написать глобальный оператор вставки QMenu - PullRequest
1 голос
/ 24 декабря 2009

Если не по какой-либо другой причине, кроме как для собственного развлечения, я хочу написать глобальный оператор вставки, чтобы я мог использовать причудливый код:

aQMenu << aQAction1 << aQAction2 << aQAction2 << seperator << aQAction3;

Возможно, вы ненавидите синтаксис, но я бы хотя бы попробовал его использовать. Проблема в том, что я впервые пытаюсь написать код оператора вставки, и я в тупике. Код для вставки enum «seperator» в QMenu * прост, и у меня это работает, но я думал, что этот код будет работать для вставки QAction * в QMenu *:

// does not compile:  "must have an argument of class or enumerated type"
QMenu *operator<< (QMenu *menu, QAction *action)
{
        menu->addAction(action);
        return menu;
}

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

Я знаю, что некоторые программисты будут жаловаться на то, что я отклоняюсь от стандартного синтаксиса Qt, но я получаю удовольствие от перегрузки оператора << и другими классами. Просто кажется, что оператор вставки прекрасно работает здесь. Что я могу сказать - это делает меня счастливым. </p>

Ответы [ 2 ]

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

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

QMenu& operator<< (QMenu &menu, QAction *action) {
    menu.addAction(action);
    return menu;
}

Теперь этот оператор должен работать с объектами меню. Если вы хотите использовать его с указателем на меню, вам нужно разыменовать этот указатель при применении нового оператора <<:

QMenu *menu = new QMenu();
QAction *action1, *action2;
...
*menu << action1 << action2;
0 голосов
/ 28 декабря 2009

Теперь все отлично работает. Я использую код

QMenu& operator<< (QMenu &menu, QAction *action) {
    menu.addAction(action);
    return menu;
}

, чтобы я мог манипулировать моим QMenu с небольшим синтаксисом

*mnuFile << actNewFile << actOpenFile << actCloseFile << seperator << actExit;

(другой фрагмент кода позволяет оператору вставки принимать мой аргумент "seperator").

Кроме того, я читал на этих форумах, что Андрей Александреску посвящает немало страниц, посвященных синглтонам умных регистраторов, в "Современном C ++ Design". Я все еще пытаюсь понять, пока мой оператор << code </p>

QMenu* operator<< (QMenu* obj, MyMenuInsertEnum val);

допустимо (первый параметр - указатель). Но это не так:

QMenu *operator<< (QMenu *menu, QAction *action);

И проблема только в указателе в качестве первого аргумента. После прочтения вышеупомянутой книги я добавлю здесь свои выводы, если узнаю что-то новое.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...