如果没有其他原因而不是为了我自己的娱乐,我希望编写一个全局插入操作符,以便我可以使用花哨的代码:
aQMenu << aQAction1 << aQAction2 << aQAction2 << seperator << aQAction3;
也许你讨厌语法,但我至少想尝试使用它。问题是,这是我第一次尝试编写插入操作符代码,而且我很难过。将枚举“分隔符”插入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语法,但我很乐意重载运算符&lt;&lt;与其他课程一样。似乎插入操作符在这里工作得很好。我能说什么 - 这让我很开心。
答案 0 :(得分:5)
编译器抱怨因为所有参数都是指针。使用运算符菜单参数的引用,它将如下所示:
QMenu& operator<< (QMenu &menu, QAction *action) {
menu.addAction(action);
return menu;
}
现在这个操作符应该处理菜单对象。如果要将其与指向菜单的指针一起使用,则需要在应用新的<<
运算符时取消引用该指针:
QMenu *menu = new QMenu();
QAction *action1, *action2;
...
*menu << action1 << action2;
答案 1 :(得分:0)
现在一切正常。我使用代码
QMenu& operator<< (QMenu &menu, QAction *action) {
menu.addAction(action);
return menu;
}
所以我可以使用
的漂亮小语法来处理我的QMenu*mnuFile << actNewFile << actOpenFile << actCloseFile << seperator << actExit;
(另一段代码片段允许插入操作符接受我的“seperator”参数)。
另外,我在这些论坛上看到Andrei Alexandrescu在“现代C ++设计”中专注于智能记录器单例的几页。我仍在努力抓住我的操作员&lt;&lt;代码
QMenu* operator<< (QMenu* obj, MyMenuInsertEnum val);
有效(第一个参数是指针)。但这不是:
QMenu *operator<< (QMenu *menu, QAction *action);
问题只是指针作为第一个参数。在我读完上述书之后,我会在这里附上我的发现,只要我学到新东西。