qt - 无法在qlist

时间:2017-01-23 15:26:22

标签: c++ qt struct qlist

关于:

p.s.我知道这是一个具体问题,但我很茫然,不知道为什么会发生这种情况

下面的算法应该在列表中添加一个结构。每个结构都是server_connection对象,接收列表包含在另一个名为VPN_Server的结构中。

将结构添加到列表时,它只保留添加的第一个结构,并且不再添加。

调试器窗口确认了这一点:

对于每个新IP,会创建一个新的VPN_Server结构,并创建一个新的server_connection并将push_back添加到ServerInstancesList列表中。但是当在foreach循环中时,尝试添加对象是徒劳的。

问题:

server_connection对象推送到特定VPN_Server结构时,它会将此数据保存在临时foreach容器中,但不会应用它。

我尝试过:

  1. addConnection() VPN_Server

    添加自定义struct方法

    void addConnection(server_connection s_con){     ServerInstancesList.push_back(s_con); }

  2. 创建临时列表,添加server_connection并创建新的VPN_server对象,并将其设置为等于当前的foreach容器。

  3. 这些都没有帮助。

    测试&深入描述:

    在算法中,我的第一个和第三个vpn_connection struct具有相同的IP。在第三次迭代中,执行foreach循环并发生以下情况。

    VPN_Server ser包含第一个结构信息的信息,即QList<server_connection>中名为ServerInstancesList的IP和一个对象。

    ser通过addConnection(s_con)添加了一个对象。然后,循环终止并返回。但是ser注册了添加的对象,而在foreach循环之外,没有添加新对象。甚至没有列表中的任何结构。

    这似乎很容易解决,但我找不到它,

    帮助将不胜感激!

    代码:

    server_connection

    struct server_connection{
    
        //Is a connection contained by IP
    
        QString cipher,protocol;
        int port;
        bool lzo_compression;
    
        server_connection(){}
    
        server_connection(QString _cipher, QString _protocol, int _port, bool _comp){
            cipher = _cipher;
            protocol = _protocol;
            port = _port;
            lzo_compression = _comp;
        }
    };
    

    VPN_Server

    struct VPN_Server{
    
        //Holds IP as sort value and list of connection info
        QString VPN_IP;
        QList<server_connection> ServerInstancesList;
    
        VPN_Server(){
            ServerInstancesList = QList<server_connection>();
        }
    
        VPN_Server(QString ip, QList<server_connection> server_con_list){
            VPN_IP = ip;
            ServerInstancesList = server_con_list;
        }
    
        void addConnection(server_connection s_con){
            ServerInstancesList.push_back(s_con);
        }
    };
    

    算法:

    QList<VPN_Server> data_mananger::parseVPNConnections(QList<VPNConnection> l){
    
        //Init var
        QList<VPN_Server> server_list = QList<VPN_Server>();
        VPNConnection v_con;
        bool bAdded = false;
        server_connection s_con;
    
        //processing all vpn_connections, this is raw form sent, contains as fields, ip, cipher, protocol, port, compression
        foreach (v_con, l) {
    
            //create server_connection - data sorted by ip
            s_con = server_connection(v_con.cipher, v_con.protocol, v_con.port, v_con.lzo_compression);
    
            //pass through existing data, checking for a matching ip
            foreach (VPN_Server ser, server_list) {
                if (ser.VPN_IP == v_con.ip) {
                    //ip match found -> there already exists and ip with a server connection, adding another one with s_con
                    ser.addConnection(s_con);
                    bAdded = true;
                    //break current loop short searching for a matching ip
                    break;
                }
            }
    
            //bAdded = false -> no matching IP has been found, thus creating a nw VPNServer
            if (!bAdded) {
                VPN_Server serv;
                //creating new connection list and adding s_con to this list
                QList<server_connection> list = QList<server_connection>();
                list.push_back(s_con);
    
                //adding VPNServer to list containing VPNServers
                serv = VPN_Server(v_con.ip, list);
                server_list.push_back(serv);
            }
            else
                //data has been added, reseting add flag
                bAdded = false;
    
        }
        return server_list;
    }
    

1 个答案:

答案 0 :(得分:0)

感谢所有帮助过的人!

请访问以下QT论坛的链接,并对VRonin的解决方案竖起大拇指。

同样kudo's@YuriyIvaskevych帮助我来SO!

重申(budum tsss *)doc page

  

Qt在进入时会自动获取容器的副本   foreach循环。如果您在迭代时修改容器,那就是   不会影响循环。 [...]使用非const引用   变量不允许您修改原始容器

由<{3}}

创建的

解决方案

for (auto serIter= server_list.begin(); serIter!=server_list.end(); ++serIter) {

    if (serIter->VPN_IP == v_con.ip) {
        //ip match found -> there already exists and ip with a server connection, adding another one with s_con
        serIter->addConnection(s_con);
        bAdded = true;
        //break current loop short searching for a matching ip
        break;
    }
}