在C+中创建对象+,如果已经建成怎么办? 我对C++仍然是新的。我想从多个来源阅读信息。每个源将以4个字符的ID开始数据消息。每个源还将有多个数据消息。没有一条消息包含我希望从设备获得的所有信息。因此,如果我创建了一个ID为对象名的对象,那么下次收到消息时,该对象会被更新还是完全重建?在代码中调用对象之前,是否有方法检查对象是否已构造 class Channels{ public: INT8U systemID; //0x01 Glonass, 0x02 GPS INT8U satID; INT8U GlonassNumber; INT8U SNR; //signal to noise ratio FP64 carrierPhase; //cylces FP64 psuedoRange; //milliseconds FP64 doppler; //HZ cycles float tropDelay; //meters float ionoDelay; //meters }; class BaseStation{ public: Channels channel[32]; //each channel object has all channel class variables in it int numberSatelitesTracked; FP64 timeUTC; INT16U week; FP64 GPStoUTCoffset; FP64 GLOtoUTCoffset; INT8S recieverTimeOffset; FP64 posX; //geocentric coordinates in meters FP64 posY; FP64 posZ; FP64 rmsX; //expected root mean square error of coordinates FP64 rmsY; FP64 rmsZ; }; if( check == SOCKET_ERROR){ if( WSAGetLastError() != WSAEWOULDBLOCK){ printf("base station client recieve failed with error %d \n", WSAGetLastError()); FreeSocketInformation(i); //shuts down client socket if no data } continue; } else{ //recieve bytes into array memcpy(recvArray, SocketInfo->DataBuf.buf, SocketInfo->RecvBytes +1); //print recieved bytes on screen printf("%s \n", SocketInfo->DataBuf.buf); //first 4 bytes in message are base ID cBuffer[0] = recvArray[0]; cBuffer[1] = recvArray[1]; cBuffer[2] = recvArray[2]; cBuffer[3] = recvArray[3]; baseID = cBuffer; //create object with 4 char name BaseStation baseID; //test message identity and sort data if(recvArray[4] == 0x10 && recvArray[5] == 0xF5){ baseID.timeUTC = combine64(recvArray[6]); baseID.week = combine16u(recvArray[14]); baseID.GPStoUTCoffset = combine64(recvArray[16]); baseID.GLOtoUTCoffset = combine64(recvArray[24]); baseID.recieverTimeOffset = recvArray[32]; int noChannels = (check-30) /30 ; if (noChannels >= 32){ noChannels = 32; } int x = 33; for(int m = 0; m < noChannels; m++){ //advance reading for channel m baseID.channel[m].systemID = recvArray[x]; x++; baseID.channel[m].satID = recvArray[x]; x++; baseID.channel[m].GlonassNumber = recvArray[x]; x++; baseID.channel[m].SNR = recvArray[x]; x++; baseID.channel[m].carrierPhase = combine64(recvArray[x]); x = x+8; baseID.channel[m].psuedoRange = combine64(recvArray[x]); x = x+8; baseID.channel[m].doppler = combine64(recvArray[x]); x = x+10; } //end of for loop to gather F5 sat data } //end F5 message data if(recvArray[4] == 0x10 && recvArray[5] == 0xF6){ baseID.posX = combine64(recvArray[6]); baseID.posY = combine64(recvArray[14]); baseID.posZ = combine64(recvArray[22]); baseID.rmsX = combine64(recvArray[30]); baseID.rmsY = combine64(recvArray[38]); baseID.rmsZ = combine64(recvArray[46]); } //end F6 message data

在C+中创建对象+,如果已经建成怎么办? 我对C++仍然是新的。我想从多个来源阅读信息。每个源将以4个字符的ID开始数据消息。每个源还将有多个数据消息。没有一条消息包含我希望从设备获得的所有信息。因此,如果我创建了一个ID为对象名的对象,那么下次收到消息时,该对象会被更新还是完全重建?在代码中调用对象之前,是否有方法检查对象是否已构造 class Channels{ public: INT8U systemID; //0x01 Glonass, 0x02 GPS INT8U satID; INT8U GlonassNumber; INT8U SNR; //signal to noise ratio FP64 carrierPhase; //cylces FP64 psuedoRange; //milliseconds FP64 doppler; //HZ cycles float tropDelay; //meters float ionoDelay; //meters }; class BaseStation{ public: Channels channel[32]; //each channel object has all channel class variables in it int numberSatelitesTracked; FP64 timeUTC; INT16U week; FP64 GPStoUTCoffset; FP64 GLOtoUTCoffset; INT8S recieverTimeOffset; FP64 posX; //geocentric coordinates in meters FP64 posY; FP64 posZ; FP64 rmsX; //expected root mean square error of coordinates FP64 rmsY; FP64 rmsZ; }; if( check == SOCKET_ERROR){ if( WSAGetLastError() != WSAEWOULDBLOCK){ printf("base station client recieve failed with error %d \n", WSAGetLastError()); FreeSocketInformation(i); //shuts down client socket if no data } continue; } else{ //recieve bytes into array memcpy(recvArray, SocketInfo->DataBuf.buf, SocketInfo->RecvBytes +1); //print recieved bytes on screen printf("%s \n", SocketInfo->DataBuf.buf); //first 4 bytes in message are base ID cBuffer[0] = recvArray[0]; cBuffer[1] = recvArray[1]; cBuffer[2] = recvArray[2]; cBuffer[3] = recvArray[3]; baseID = cBuffer; //create object with 4 char name BaseStation baseID; //test message identity and sort data if(recvArray[4] == 0x10 && recvArray[5] == 0xF5){ baseID.timeUTC = combine64(recvArray[6]); baseID.week = combine16u(recvArray[14]); baseID.GPStoUTCoffset = combine64(recvArray[16]); baseID.GLOtoUTCoffset = combine64(recvArray[24]); baseID.recieverTimeOffset = recvArray[32]; int noChannels = (check-30) /30 ; if (noChannels >= 32){ noChannels = 32; } int x = 33; for(int m = 0; m < noChannels; m++){ //advance reading for channel m baseID.channel[m].systemID = recvArray[x]; x++; baseID.channel[m].satID = recvArray[x]; x++; baseID.channel[m].GlonassNumber = recvArray[x]; x++; baseID.channel[m].SNR = recvArray[x]; x++; baseID.channel[m].carrierPhase = combine64(recvArray[x]); x = x+8; baseID.channel[m].psuedoRange = combine64(recvArray[x]); x = x+8; baseID.channel[m].doppler = combine64(recvArray[x]); x = x+10; } //end of for loop to gather F5 sat data } //end F5 message data if(recvArray[4] == 0x10 && recvArray[5] == 0xF6){ baseID.posX = combine64(recvArray[6]); baseID.posY = combine64(recvArray[14]); baseID.posZ = combine64(recvArray[22]); baseID.rmsX = combine64(recvArray[30]); baseID.rmsY = combine64(recvArray[38]); baseID.rmsZ = combine64(recvArray[46]); } //end F6 message data,c++,object,constructor,exists,C++,Object,Constructor,Exists,C++是一种静态类型语言,您需要在编译时提供对象名。 您不能在运行时创建对象名称并使用该名称创建对象。C++是一种静态类型语言,您需要在编译时提供对象名称。 不能在运行时创建对象名称,并用该名称创建对象。< P>已回答,C++中不能这样做。 然而,你可以用另一种方式解决你的问题。 首先,您需要将一些ID绑定到结构基站的某个具体对象。您可以通过两种方式提供此链接—在关联容器中保存基站对象,其中键是ID,或者通过保存基站对象数组(据我猜测,您正在编写某种微控制器代码,因此std容器不适用于您) 第一

C++是一种静态类型语言,您需要在编译时提供对象名。

您不能在运行时创建对象名称并使用该名称创建对象。

C++是一种静态类型语言,您需要在编译时提供对象名称。

不能在运行时创建对象名称,并用该名称创建对象。

< P>已回答,C++中不能这样做。 然而,你可以用另一种方式解决你的问题。 首先,您需要将一些ID绑定到结构基站的某个具体对象。您可以通过两种方式提供此链接—在关联容器中保存基站对象,其中键是ID,或者通过保存基站对象数组(据我猜测,您正在编写某种微控制器代码,因此std容器不适用于您)

第一种方法代码示例:

//id is 4 char so it can be thought as int on most systems
std::map<int, BaseStation *> baseStations;
int * id = (int*)recvArray; //this hack is for showing how you can convert 4 char to int
    //may be in your code (int id = combine32(recvArray[0])) is equvivalent
if(baseStations.find(*id) != baseStations.end()) //checking existance of object with such id
{
    //ok, exists, do nothing
}
else
    baseStations[*id] = new BaseStation(); //create new

baseStations[*id].timeUTC = combine64(recvArray[6]); //starting copying values
//other values copying

正如已经回答的,C++中不能这样做。 然而,你可以用另一种方式解决你的问题。 首先,您需要将一些ID绑定到结构基站的某个具体对象。您可以通过两种方式提供此链接—在关联容器中保存基站对象,其中键是ID,或者通过保存基站对象数组(据我猜测,您正在编写某种微控制器代码,因此std容器不适用于您)

第一种方法代码示例:

//id is 4 char so it can be thought as int on most systems
std::map<int, BaseStation *> baseStations;
int * id = (int*)recvArray; //this hack is for showing how you can convert 4 char to int
    //may be in your code (int id = combine32(recvArray[0])) is equvivalent
if(baseStations.find(*id) != baseStations.end()) //checking existance of object with such id
{
    //ok, exists, do nothing
}
else
    baseStations[*id] = new BaseStation(); //create new

baseStations[*id].timeUTC = combine64(recvArray[6]); //starting copying values
//other values copying

听起来你想要一个像
std::map
的东西,尽管你的问题不是很清楚……对
combine64()
的调用看起来是错误的。您可能希望传递指向8个字符的指针,而不是单个字符。例如,
baseID.posX=combine64(&recvArray[6])
or
baseID.posX=combine64(recvArray+6)
我曾尝试使用&就像您所展示的那样,但是如果对函数的调用是main,编译器将显示错误。如果调用在不同的函数中,那么如果我不使用&,它将抛出错误。使用代码块。我不熟悉那样使用+吗
double-combine64(char-dn[8]){union{double-f;char-b[8];}fn;fn.b[7]=dn[7];fn.b[6]=dn[6];fn.b[5]=dn[5];fn.b[4]=dn[4];fn.b[3]=dn[3];fn.b[2]=dn[2];fn.b[1]=dn[1];fn.b[0]=dn[0];返回fn.f;}/code>这听起来像是你想要的代码,虽然您的问题不是很清楚,但是对
combine64()
的调用看起来是错误的。您可能希望传递指向8个字符的指针,而不是单个字符。例如,
baseID.posX=combine64(&recvArray[6])
or
baseID.posX=combine64(recvArray+6)
我曾尝试使用&就像您所展示的那样,但是如果对函数的调用是main,编译器将显示错误。如果调用在不同的函数中,那么如果我不使用&,它将抛出错误。使用代码块。我不熟悉那样使用+吗
double combine64(char dn[8]){union{double f;char b[8];}fn;fn.b[7]=dn[7];fn.b[6]=dn[6];fn.b[5]=dn[5];fn.b[4]=dn[4];fn.b[3]=dn[3];fn.b[2]=dn[2];fn.b[1]=dn[1];fn.b[0]=dn[0];return fn.f;}/code
。这实际上是我第一次尝试在Windows下使用控制台程序。过去我只使用微控制器。我并不完全熟悉第二个示例的所有语法,但我开始了解它的工作原理,谢谢。在这里使用
重新解释\u cast
,并避免在条件语句中克隆代码会很好。这实际上是我第一次尝试在Windows下使用控制台程序。过去我只使用微控制器。我并不完全熟悉第二个示例的所有语法,但我开始了解它的工作原理,谢谢。
//BaseConnection also holds field names id;
BaseConnection baseConnections[N];
int FindId(int id); //return index of element in baseConnections array with this id

BaseConnection * workingConnection = &baseConnections[FindId(combine32(recvArray[0]))];
workingConnection->timeUTC = combine64(recvArray[6]); //starting copying values
//other values copying