0

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*)':
4

5 に答える 5

2

あなたは;byte BmcDataBuffer[]を欠いていて、クラス宣言も間違っているように見えます:私が推測するclassFather{はずです。class Father {

于 2012-10-24T14:08:31.623 に答える
2
byte BmcDataBuffer[]

これをに変更します

byte *BmcDataBuffer;

ああ、ちなみに、これらの行:

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

また間違っています。渡された配列の長さをそのように決定することはできません。

于 2012-10-24T14:08:38.577 に答える
2

と書くことbyte BmcDataBuffer[]で、宣言して配列します。配列はポインタではないため、割り当てることはできませんnew byte[CMD_LENGTHH]。宣言をに変更するbyte *BmcDataBufferと、コンパイルエラーが解決されます。

deleteそうすることで、オブジェクトが次のようなことで破壊されたときに、新しく割り当てられたデータを覚えておく必要があります。

~classFather() {
   delete BmcDataBuffer;
}

そうしないと、メモリリークが発生します。

于 2012-10-24T14:08:41.563 に答える
1

加えて、

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

あなたが期待するものではありません。関数に渡される C スタイルの配列のサイズは常に不明です。

sizeor useの追加パラメータが必要std::vectorです。

于 2012-10-24T14:12:05.277 に答える
1

他の人が言ったように、配列にポインターを割り当てようとします。

この方法でメモリ リークを書き込むよりは ( anewが表示されますが、 no が表示されますdelete)、 a を使用し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

于 2012-10-24T14:12:44.060 に答える