QT C++如何正确创建以对象为参数的函数
QT C++ How to properly create functions with Object as Parameters
我在C++中创建了一个类,其中有一个方法,它接收同一类的对象作为参数。
我的类定义没有错误,但是当使用该方法时,我会得到以下错误:
error: C2662: 'bool Cliente::igual(const Cliente &)' : cannot convert 'this' pointer from 'const Cliente' to 'Cliente &'
Conversion loses qualifiers
我不需要修改我作为参数发送的对象,所以我认为最好的方法是使用引用。然而,我对C++还很陌生,任何关于使用什么的建议(指针、引用、cons引用)都将不胜感激。
客户端
#ifndef CLIENTE_H
#define CLIENTE_H
#include "qstring.h"
class Cliente
{
public:
Cliente();
Cliente(QString,QString,QString);
QString nombre;
QString email;
QString phone;
bool igual( const Cliente& c);
const QString getNombre();
const QString getEmail();
const QString getPhone();
};
#endif // CLIENTE_H
Client.cpp
#include "cliente.h"
#include "qstring.h"
Cliente::Cliente() {}
Cliente::Cliente(QString n, QString e, QString p){
nombre = n;
email = e;
phone = p;
}
QString const Cliente::getNombre(){
return nombre;
}
QString const Cliente::getEmail(){
return email;
}
QString const Cliente::getPhone(){
return phone;
}
bool Cliente::igual(const Cliente& c){
Cliente::if(nombre == c.getNombre() && email == c.getEmail() && phone == c.getPhone()){
return true;
}
return false;
}
方法使用:
QList<Cliente> clientList;
while(query.next()){
name = QString("A%1").arg(i);
email = QString("B%1").arg(i);
phone = QString("C%1").arg(i);
QString valName = query.value(0).toString();
QString valEmail = query.value(1).toString();
QString valPhone = query.value(2).toString();
Cliente cliente(valName,valEmail,valPhone);
bool existe = false;
for (int j = 0; j < clientList.size(); ++j) {
if (clientList.at(j).igual(cliente)){
existe = true;
break;
}
}
if(!existe){
clientList.append(cliente);
xlsx.write(name,valName);
xlsx.write(email,valEmail);
xlsx.write(phone,valPhone);
}
i++;
}
错误发生在:clientList.at(j).igual(cliente))
为nombre
、email
和phone
添加getter。
这些getter方法应该是const
方法。
(例如:QString getNombre() const { return nombre; }
)
然后像下面的一样进行比较
if(nombre == c.getNombre() && email == c.getEmail() && phone == c.getPhone()){
return true;
}
- 您的getter方法和比较应该是
const
。您还可以实现operator==
,从而不需要名为igual
的方法 -
你包含了错误的文件。包含内容应为:
#include <QString>
而不是
"qstring.h"
,即使它恰好适用于QString
的特定情况。 -
返回
const QString
毫无意义。那里的const
是多余的,没有任何作用。 - getter隐藏的数据成员应该是私有的,或者至少是受保护的
QString
参数应作为常量引用传递- 在适当的情况下,在构造函数中使用初始值设定项列表
- 您可以直接返回比较结果,毕竟它是一个布尔值
- 就风格而言,getter可能应该简单地命名为
foo
,而不是getFoo
考虑到以上情况,您的代码应该如下所示:
客户端.h
#ifndef PABLO_CLIENTE_H
#define PABLO_CLIENTE_H
#include <QString>
class Cliente
{ // The members below are all private.
QString m_nombre;
QString m_email;
QString m_phone;
public:
Cliente();
Cliente(const QString &, const QString &, const QString &);
bool operator==(const Cliente &) const;
QString nombre() const;
QString email() const;
QString phone() const;
};
#endif
客户端.cpp
#include "Cliente.h"
Cliente::Cliente() {}
Cliente::Cliente(const QString & nombre,
const QString & email, const QString & phone) :
// Initializer list must match the order of member declarations!
m_nombre(nombre), m_email(email), m_phone(phone)
{}
QString Cliente::nombre() const {
return m_nombre;
}
QString Cliente::email() const {
return m_email;
}
QString Cliente::getPhone() const {
return m_phone;
}
bool Cliente::operator==(const Cliente & c) const {
return nombre() == c.nombre() && email() == c.email() && phone() == c.phone();
}
对于像这样的简单类,您可以将所有代码放入头中:
客户端.h(无.cpp!)
#ifndef PABLO_CLIENTE_H
#define PABLO_CLIENTE_H
#include <QString>
class Cliente
{ // The members below are all private.
QString m_nombre;
QString m_email;
QString m_phone;
public:
Cliente() {}
Cliente(const QString & nombre,
const QString & email, const QString & phone) :
// Initializer list must match the order of member declarations!
m_nombre(nombre), m_email(email), m_phone(phone)
{}
bool operator==(const Cliente & c) const {
return nombre() == c.nombre() && email() == c.email() && phone() == c.phone();
}
QString nombre() const { return m_nombre; }
QString email() const { return m_email; }
QString phone() const { return m_phone; }
};
#endif
相关文章:
- 将可变参数函数的参数封装在类实例中
- QML 使用带有参数C++函数
- 使用可变参数函数作为模板参数
- 如何在C++中伪造虚拟可变参数函数模板?
- 为什么可变参数函数不适用于模板
- C++ std::functional 中的可变参数函数模板
- 可变参数函数指针的定义对于VxWorks spyLib来说不清楚
- 使用可变参数函数覆盖具有不同函数签名的虚函数
- 考虑引用和常量的可变参数函数包装器
- 使用可变参数函数将整数和/或整数数组放入单个 int 数组中
- 在可变参数函数中转发特定范围的参数
- 通过引用传递参数;函数返回类型是否必须为 VOID?
- 使用带有一个参数函数的递归找到数字的平方
- 可变参数函数模板不能很好地使用 std::function 作为参数
- 多个可变参数函数的单个模板参数包?
- 参数数据类型未知的可变参数函数
- 可变参数函数参数包扩展
- 使用模板可变参数函数将多个参数传递给另一个函数
- 对可变参数函数的递归调用的链接器错误
- 通过像printf这样的可变参数函数传递一个带有常量字符*转换函数的类