公共类赋值失败,请讲解一下

为什么我的公共类赋值失败?

void DTSConcent::ReadMessage()
{
    QByteArray buf = m_tcpClient->readAll();//读取数据
    if (buf.size() >14)
    {
       QString s=buf.toHex();

       QByteArray hexData = buf.toHex();
       char *p = hexData.data();
       if (s[0] == 'c'&&s[1] == 'c'&&s[2] == 'a'&&s[3] == 'a')
       {
           bool ok;
           int chNo = s.mid(16, 2).toInt(&ok, 16);
           QList<FiberLine> *linss =  PubFiberInfo->lines;
           *line = linss ->at(0);
           uint16_t dd = line->segmentlen;
           QString slen = s.mid(4, 8);
           int dataLen = slen.toInt(&ok, 16);
           //前190米为测试数据,不进行计入,0.4米一个点
           uint16_t reallen = dataLen<190/0.4 + 8?0:dataLen-(190/0.4 + 8);
           line->reallen = reallen;
           qDebug()<<line->reallen;
        //   line->GetFiberLineMax()
           //int len = QString::mid(int position, int n = -1) const
           //MainProcess::tfiber->Init();

       }

    }
}

img

当再次循环到该方法时,公共变量PubFiberInfo的reallen还是初始化的值。

*line = linss ->at(0);

这行是给line所指向的对象赋值,不是改变line的指向,所以如果line本来不是指向PubFiberInfo下面的话,我没看出你有哪里修改了PubFiberInfo的值
如果你想让line指向PubFiberInfo->lines的第一个元素,那么应该用

line = &(*linss)[0];
不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    答案:

    从您的问题描述来看,这个公共类的变量可能被多次调用的方法修改了,导致赋值被覆盖。为了解决这个问题,您可以考虑以下两种方法:

    1.使用静态变量

    如果PubFiberInfo是一个实例变量,那么在多个对象之间共享该变量时,就需要使用静态变量。静态变量不会被实例化对象所重新初始化,因此可以保持原来的赋值。代码示例如下:

    public class Demo {
        public static PubFiberInfo pubFiberInfo;
        public void method(){
            if(pubFiberInfo == null){
                pubFiberInfo = new PubFiberInfo();
                //初始化PubFiberInfo
            }
            //do something
            pubFiberInfo.reallen = newReallen;
        }
    }
    

    2.使用单例模式

    单例模式也可以保持公共变量值的一致。单例模式保证程序中只有一个实例对象可以被创建。对于公共变量,可以使用静态单例模式,使全局只有一个实例。代码示例如下:

    public class PubFiberInfoSingleton {
        private static PubFiberInfoSingleton instance;
        private PubFiberInfo pubFiberInfo;
    
        private PubFiberInfoSingleton() {
            pubFiberInfo = new PubFiberInfo();
            //初始化pubFiberInfo
        }
    
        public static synchronized PubFiberInfoSingleton getInstance() {
            if (instance == null) {
                instance = new PubFiberInfoSingleton();
            }
            return instance;
        }
    
        public PubFiberInfo getPubFiberInfo() {
            return pubFiberInfo;
        }
    
        public void setPubFiberInfo(PubFiberInfo pubFiberInfo) {
            this.pubFiberInfo = pubFiberInfo;
        }
    }
    
    public class Demo {
        public void method(){
            PubFiberInfoSingleton pubFiberInfoSingleton = PubFiberInfoSingleton.getInstance();
            PubFiberInfo pubFiberInfo = pubFiberInfoSingleton.getPubFiberInfo(); 
            //do something
            pubFiberInfoSingleton.setPubFiberInfo(pubFiberInfo); 
        }
    }
    

    以上两种方式均可以解决公共变量重新初始化的问题。期望我的回答能够帮到您。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^