0

C++ でカスタム オブジェクトの配列へのポインターを使用しようとしています。次のコードは、cygwin の gnu コンパイラを使用する Eclipse でコンパイルおよび実行されます。しかし、このコードは Visual Studio でコンパイル エラーを返します。

エラー

class 'Levels' has an illegal zero-sized array

オンライン

Structure *mStructres[];

完全なコード

/*
 * Levels.h
 */

#include "objects/Structure.h"

#ifndef LEVELS_H_
#define LEVELS_H_

class Levels{

public:

    //other public members

    void reInitialize();
    Levels();
    ~Levels();


private:
    //other private members
    Structure *mStructres[];
};

#endif /* LEVELS_H_ */

/////////////////////////////////////
/*
 * Levels.cpp
 */
#include "Levels.h"

Levels::Levels() {
}

Levels::~Levels() {

}

void Levels::reInitialize() {
    mStructres[size];
                for (int i = 0; i < jStructeresArr.size(); i++) {
                mStructres[i] = new Structure(obj1, obj2,
                            obj3);
                }
}

行を次のように変更してみました

Structure *mStructres;

しかし、その後、再初期化メソッドでこれらの行にエラーが発生しました

mStructres[size];
            for (int i = 0; i < jStructeresArr.size(); i++) {
            mStructres[i] = new Structure(obj1, obj2,
                        obj3);
            }

私は何を間違っていますか?これは、クロスプラットフォーム開発のために正しい方法ですか?

更新 この段階では、ベクターまたは標準テンプレートを使用しないことをお勧めします。

4

1 に答える 1

0

Structure *mStructres[];Structure **mStructresおそらく、コンパイラの 1 つによって解釈されていると思われます。実際には (単一のポインターを除いて) 指すストレージが割り当てられていないことに注意してください。そのため、何かを割り当てると、ランダムなメモリに書き込んでいるだけです。

mStructres[size];       // This does nothing, it _could_ cause a crash... 
                        //  but is otherwise the same as the next statement
42;
for (int i = 0; i < jStructeresArr.size(); i++)
    mStructres[i] = new Structure(obj1, obj2, obj3);

あなたがやりたかったことは、ポインターの配列を再作成することでした。

void Levels::reInitialize() {
    for (int i=0; i< jStructeresArr.size(); i++) {
        delete mStructres[i];      // Don't leak memory
        mStructres[i] = new Structure(obj1, obj2, obj3);
    }
}

コンストラクターには次の行も必要です。(ここからインスピレーションを得た)

    mStructres = new Structure*[jStructeresArr.size()];

jStructeresArr.size() が変更された場合、かなりの作業が必要になります。その可能性がある場合は、これを捨てて、std::vector または std::list を使用することを強くお勧めします。

于 2013-04-01T06:04:15.533 に答える