2016-05-30 414 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 &); 
}; 
相关问题