2013-04-20 206 views
1

我试图在Qt中重载operator <<如何超载运算符<<

class MyCryptographicHash : public QCryptographicHash 
{ 
public: 
    MyCryptographicHash(Algorithm method); 

    void addData(const QString &data); 

    friend MyCryptographicHash& operator<< (MyCryptographicHash &obj, const QString &value); 

private: 
    QByteArray _data; 
}; 

MyCryptographicHash& operator<<(MyCryptographicHash &obj, const QString &value) { 
    obj.addData(value); 
    return obj; 
} 


    MainWindow::MainWindow(QWidget *parent) 
    : QMainWindow(parent) 
{ 
    MyCryptographicHash *hash1 = new MyCryptographicHash(QCryptographicHash::Sha1); 
    MyCryptographicHash *hash2 = new MyCryptographicHash(QCryptographicHash::Sha1); 
    hash1->addData("abc1234"); 
    QString a; 
    a = "qweer321"; 
    hash2<<a; 
    qDebug() << "HASH1: " << hash1->result(); 
    qDebug() << "HASH2: " << hash2->result(); 
} 

,但我得到的错误:

no match for 'operator<<' in 'hash2 << a' 

我想申报操作作为类中的一员,同时也得到一个错误。

error: 'MyCryptographicHash& MyCryptographicHash::operator<<(MyCryptographicHash&, const QString&)' must take exactly one argument 

我在做什么错?

+0

非常感谢!我是新手:) – MrElmar 2013-04-20 07:33:50

回答

5

您的代码应该是

*hash2 << a; 

HASH2是一个指针,而不是一个对象。

但是在你发布的代码中没有明显的原因为什么 hash2是一个指针。所以你可以写

{ 
    MyCryptographicHash hash1(QCryptographicHash::Sha1); 
    MyCryptographicHash hash2(QCryptographicHash::Sha1); 
    hash1.addData("abc1234"); 
    QString a; 
    a = "qweer321"; 
    hash2 << a; 
    qDebug() << "HASH1: " << hash1.result(); 
    qDebug() << "HASH2: " << hash2.result(); 
} 

这也会有内存不泄漏的优点。

但也许还有比你发布的代码更多。