2013-08-05 42 views
1

試圖添加功能到QString但得到構建錯誤?如果我缺少東西?子類化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

+0

什麼是你的問題? – maditya

+0

爲什麼構建錯誤?如果我丟失東西 – jdl

+9

子類化QString是一個壞主意 - QString沒有虛擬析構函數,並且QStrings通過值傳遞了很多,這意味着您可能逐個對象切片。更好的方法是創建自由函數(即不是成員函數,只是接收和/或返回QString對象的函數) –

回答

2

不要派生類構成QString因爲它沒有考慮polymorphy設計(注意,沒有虛方法,特別是沒有虛析構函數),如果你想提供新的實用功能,只需使用免費的功能 - 您可能需要將它們放在一個命名空間:

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

QString(parent)的QString沒有一個構造函數取一個QObject父母作爲參數。因此,編譯器會嘗試將您的QObject轉換爲最接近的匹配構造函數,該構造函數可能爲QString (QChar ch)

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文件,它只是一個簡單的例子

+0

爲什麼要存儲''QString *'',而不是簡單的'''QString''? –

+0

您可以存儲'QString *'或'QString',這沒關係。或者我錯過了什麼? – SpongeBobFan

+0

嗯,你可以。但我看不出任何理由在這裏使用指針,你必須明確地處理副本,刪除,... –