QT C++如何正确创建以对象为参数的函数

QT C++ How to properly create functions with Object as Parameters

本文关键字:参数 函数 对象 C++ 何正确 创建 QT      更新时间:2023-10-16

我在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))

nombreemailphone添加getter。

这些getter方法应该是const方法。

(例如:QString getNombre() const { return nombre; }

然后像下面的一样进行比较

if(nombre == c.getNombre() && email == c.getEmail() && phone == c.getPhone()){
    return true;
}
  1. 您的getter方法和比较应该是const。您还可以实现operator==,从而不需要名为igual的方法
  2. 你包含了错误的文件。包含内容应为:

    #include <QString>
    

    而不是"qstring.h",即使它恰好适用于QString的特定情况。

  3. 返回const QString毫无意义。那里的const是多余的,没有任何作用。

  4. getter隐藏的数据成员应该是私有的,或者至少是受保护的
  5. QString参数应作为常量引用传递
  6. 在适当的情况下,在构造函数中使用初始值设定项列表
  7. 您可以直接返回比较结果,毕竟它是一个布尔值
  8. 就风格而言,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