对QString进行子类化以添加更多功能?

时间:2013-08-05 23:51:22

标签: c++ qt

尝试向QString添加功能但是会出现构建错误?如果我错过了什么?

#ifndef CSTRING_H
#define CSTRING_H

#include <QString>
#include <QStringList>
#include <QObject>


class CString : public QString, public QObject
{
    Q_OBJECT
public:
    explicit CString(QObject *parent = 0);
    QStringList Find(QString qstrSearch);//all occurances

signals:

public slots:

};

#endif // CSTRING_H

#include "cstring.h"

CString::CString(QObject *parent) :
    QString(parent)     //ERROR IS POINTING TO HERE
{
}


QStringList Find(QString qstrSearch)//all occurances
{//indexOf, contains
    QStringList qstrList;



    return qstrList;
}

Build error

3 个答案:

答案 0 :(得分:2)

QString(parent) Qstring没有将QObject-parent作为参数的构造函数。因此,编译器会尝试将您的QObject强制转换为最接近的匹配构造函数,这可能是QString ( QChar ch )

答案 1 :(得分:2)

您应该在此使用合成而不是继承,因为QString不是为子类设计的。如果你将它分类,你可能会遇到很多麻烦 做这样的事情:

class CString : public QObject //if you're really need this class to be QObject, that's not always a good idea
{
    Q_OBJECT
public:
    explicit CString(QObject *parent = 0) : 
        QObject(parent), 
        mString() //QString have no constructors with parameter QObject*...
    {
    }

private:
    QString mString;
}

当然,实现应该在cpp文件中,它只是一个简短的例子

答案 2 :(得分:2)

不要从QString派生类,因为它没有考虑到多态性(请注意,它没有虚拟方法,特别是没有虚拟析构函数)如果要提供新的实用程序函数,只需使用自由函数 - 您可能希望将它们放在命名空间中:

namespace CString {
    QStringList find(const QString &search);
}