设计了一个App类,需要对运算符==进行重载,但是在过程中遇到了一个错误,如下所示:
error: no match for 'operator==' (operand types are 'const App' and 'const App')
类的代码如下:
#ifndef APP_H
#define APP_H
#include <QObject>
#include <QString>
#include <QIcon>
#include <QVector>
#include "commonheader.h"
class App : public QObject
{
Q_OBJECT
public:
explicit App(QObject *parent = nullptr);
App(const App& app);
operator =(const App& app){
m_sAppName = app.m_sAppName;
m_bIsOpen = app.m_bIsOpen;
m_icon = app.m_icon;
m_index = app.m_index;
m_vPageCfg = app.m_vPageCfg;
}
private:
QString m_sAppName; //app名称
int m_id; //计数,暂时可能用不到
bool m_bIsOpen; //该app是否已经打开过,打开过表示已经将子进程中对应的界面绑定到该app界面
QIcon m_icon; //该app对应的图标
int m_index; //该app打开后的界面对应的stackedwidget的索引。从0开始,默认值为-1
QVector<SINGLE_PAGE_INFO> m_vPageCfg; //该app对应的窗口页面配置
public:
void setOpenStatus(bool flag); //设置该app是否打开
bool getIsOpenStatus(); //查询该app是否已经打开
void setAppName(QString name); //设置app的名字
QString getAppName() const; //查询app的名字
void setAppIcon(QIcon icon); //设置app的图标
void bindAppToStackedWidgetIndex(int index); //该app与stackedwidgget的具体索引绑定
void AddWinIdToV(SINGLE_PAGE_INFO pageCfg); //在vecotr中添加子进程页面配置信息
void clearAllVectorData(); //情况vector中的所有数据
int getAppBindIndex(); //获取该app绑定的stackedwidget index
void setPageCfgInfo(QVector<SINGLE_PAGE_INFO> vcfg); //设置app下的页面配置信息,包含标签名称和窗口id
bool operator==(const App& app)
{
if(m_sAppName == app.m_sAppName)
return true;
return false;
//return ((m_sAppName == app.m_sAppName)?true:false);
}
};
#endif // APP_H
遇到问题后,百思不得其解,为什么会出现这个错误?从这个错误的直译来看就是App没有匹配的==运算符重载,但是头文件中确实已经对该运算符进行了重载。
总结:
通过网络上查找资料,发现解决问题的方法是在operator==后添加了一个关键字,标识该函数是一个常函数。
bool operator==(const App& app)const
{
if(m_sAppName == app.m_sAppName)
return true;
return false;
//return ((m_sAppName == app.m_sAppName)?true:false);
}
问题虽然解决了,但是仍然不理解,这里引申出了const(常对象)的概念,疑惑有以下几点:
- 为什么添加const可以解决这个问题?下面的链接中介绍了类似的情况,但是对应到自己的例子上并没有理解。[经验总结]error: no match for ‘operator>’ (operand types are ‘const *’ and ‘const *’) { return __no match for operator>>operand_wingaso的博客-CSDN博客
- 第一步的链接中提到了常对象的概念,即用const修饰的对象,查了很多资料都是说常对象智能访问常函数,不能访问其它成员变量或者函数,但是自己实验的demo确可以访问,这是为什么?demo的代码如下:
#include <QCoreApplication>
#include <iostream>
using namespace std;
class Person{
public:
string m_Name;
int m_Age;
Person(string name, int age)
{
this->m_Name = name;
this->m_Age = age;
}
printTest(){
cout<<m_Name<<m_Age<<endl;
}
bool operator ==(const Person& p)
{
return (this->m_Name == p.m_Name) && (this->m_Age == p.m_Age);
}
};
int main(void)
{
Person const person("lilei", 20);
cout<<"name = "<<person.m_Name<<endl; //这里可以访问普通成员变量
//person.printTest(); //编译错误,这里printTest函数必须添加const关键字才可以编译通过
system("pause");
return 0;
}
希望有知道的朋友给在下留言解惑,不胜感激!!!