为什么我的公共类赋值失败?
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();
}
}
}
当再次循环到该方法时,公共变量PubFiberInfo的reallen还是初始化的值。
*line = linss ->at(0);
这行是给line所指向的对象赋值,不是改变line的指向,所以如果line本来不是指向PubFiberInfo下面的话,我没看出你有哪里修改了PubFiberInfo的值
如果你想让line指向PubFiberInfo->lines的第一个元素,那么应该用
line = &(*linss)[0];
不知道你这个问题是否已经解决, 如果还没有解决的话:答案:
从您的问题描述来看,这个公共类的变量可能被多次调用的方法修改了,导致赋值被覆盖。为了解决这个问题,您可以考虑以下两种方法:
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);
}
}
以上两种方式均可以解决公共变量重新初始化的问题。期望我的回答能够帮到您。