类声明错误

class declaration error

本文关键字:错误 声明      更新时间:2023-10-16

我尝试在C++中声明以下类;但是,我得到了以下错误。指针有问题吗?

class classFather{
public:
int BmcCommand;
int BmcDataLength;
byte BmcDataBuffer[];
classFather() {
BmcCommand = 0;
BmcDataLength = 0;
BmcDataBuffer = new byte[CMD_LENGTHH];
}
classFather(byte s8Command, int siLength, byte as8Data[]) {
BmcCommand = s8Command;
BmcDataLength = siLength;
int size = sizeof( as8Data ) / sizeof( as8Data[0] );
BmcDataBuffer = new byte[size];
for(int ii=0; ii< size; ii++)
BmcDataBuffer[ii] = as8Data[ii];
}
private:
static const short CMD_LENGTHH = 255;
};

我收到以下错误:

error: incompatible types in assignment of `byte*' to `byte[0u]'
C:....BluetoothClient/msgCAN.h: In constructor `msgCANFather::msgCANFather(byte, int, byte*)':

你在byte BmcDataBuffer[]之后缺少一个;,类声明看起来也错了:我猜classFather{应该是class Father {

byte BmcDataBuffer[]

将其更改为

byte *BmcDataBuffer;

哦,顺便说一下,这些行:

classFather(byte s8Command, int siLength, byte as8Data[]) {
int size = sizeof( as8Data ) / sizeof( as8Data[0] );

也是错的。您无法以这种方式确定传入数组的长度。

通过编写byte BmcDataBuffer[],可以声明和数组。数组不是指针,因此您无法为其分配new byte[CMD_LENGTHH]。将声明更改为byte *BmcDataBuffer将解决编译错误。

通过这样做,您需要记住在对象被破坏时通过执行以下操作来delete新分配的数据

~classFather() {
delete BmcDataBuffer;
}

否则,您将有内存泄漏。

正如其他人所说,您尝试分配指向数组的指针。

比这样写内存泄漏更好(我看到一个new但没有delete),使用vector

std::vector<byte> BmcDataBuffer;
Father(byte s8Command, int siLength, byte as8Data[]) {
...        
BmcDataBuffer.insert( BmcDataBuffer.begin(), asData, asData+size );
...
}

注意:

int size = sizeof( as8Data ) / sizeof( as8Data[0] );

将始终返回sizeof( byte* ) / sizeof( byte* ),即 1。

注意 2:您可以使用初始值设定项列表一次性创建vector成员:

Father(byte s8Command, int siLength, byte as8Data[]) 
: BmcDataBuffer( asData, asData+size )
{
}

vector构造函数将复制所有asData元素。

此外,

int size = sizeof( as8Data ) / sizeof( as8Data[0] );

不是你所期望的。传递给函数的 C 样式数组的大小始终是未知的。

您应该有一个用于size或使用std::vector的附加参数。