我尝试在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*)':
答案 0 :(得分:2)
;
之后你错过了byte BmcDataBuffer[]
,而且类声明看起来也错了:我猜classFather{
应为class Father {
。
答案 1 :(得分:2)
byte BmcDataBuffer[]
将其更改为
byte *BmcDataBuffer;
哦,顺便说一下,这些界限:
classFather(byte s8Command, int siLength, byte as8Data[]) { int size = sizeof( as8Data ) / sizeof( as8Data[0] );
也错了。你无法通过这种方式确定传入数组的长度。
答案 2 :(得分:2)
通过编写byte BmcDataBuffer[]
,声明和数组。数组不是指针,因此您无法为其指定new byte[CMD_LENGTHH]
。将您的声明更改为byte *BmcDataBuffer
将解决您的编译错误。
通过这样做,你需要记住delete
当对象被破坏时你新分配的数据是做
~classFather() {
delete BmcDataBuffer;
}
否则,你会发生内存泄漏。
答案 3 :(得分:1)
此外,
int size = sizeof( as8Data ) / sizeof( as8Data[0] );
不是你所期望的。传递给函数的C样式数组的大小始终是未知的。
您应该为size
添加其他参数或使用std::vector
。
答案 4 :(得分:1)
正如其他人所说,你试图指定一个指向数组的指针。
最好以这种方式写内存泄漏(我看到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
元素。