2016-05-30 406 views
0

我有一個從文件加載數據後調用emitResult的函數。Qt非靜態成員引用必須與特定對象相關

bool IpResolver::ResolvedInfo::load(QTextStream &in) 
{ 
ResolvedInfo rf; 
while (!in.atEnd()) 
{ 
    QString line = in.readLine(); 
    QStringList list = line.split(' '); 
    list[0] = rf.country; 
    list[1] = rf.ip; 
    if (rf.ip.isEmpty() == false) 
    { 
     emitResult(rf); 
    } 
} 
} 

因此,這裏是emitResult聲明:

private: 
    void emitResult(const ResolvedInfo &data); 

,這讓我這個錯誤: 的非靜態成員引用必須是相對於特定對象 不知道該怎麼辦。

+1

你能否給我們提供關於'load() '功能? –

回答

1

emitResult是我設想的一個非靜態成員函數IpResolver。然而你沒有任何實例,從子類IpResolver::ResolvedInfo中調用它。請記住,僅僅因爲ResolvedInfo是一個子類,並沒有以任何其他方式使它變得特別。具體而言,如果它不包含對父類實例的引用,它將無法按照您期望的方式工作。

一般有兩種方法可以解決你的問題:

你可以傳遞一個參考IpResolverResolvedInfo構造,並保留在ResolvedInfo實例的引用:

class IpResolver { 
    class ResolvedInfo { 
    IpResolver & q; 
    public: 
    ResolvedInfo(IpResolver & q) : q(q) { ... } 
    static bool load(QTextStream &in) { 
     ResolvedInfo rf; 
     while (!in.atEnd()) 
     { 
     QString line = in.readLine(); 
     QStringList list = line.split(' '); 
     list[0] = rf.country; 
     list[1] = rf.ip; 
     if (!rf.ip.isEmpty()) 
      q.emitResult(rf); 
     } 
    } 
    }; 
    void emitResult(const ResolvedInfo &); 
    ... 
}; 

也可以使emitResult一個靜態方法:

class IpResolver { 
    ... 
    static void emitResult(const ResolvedInfo &); 
}; 
相關問題