0

紛らわしいタイトルですみません…

私は C++ をいじり、ゲーム (Kerbal Space Program) の保存ファイルを解析して、それを変更し、最終的にネットワーク経由で送信できるようにするプロジェクトに取り組んでいます。不明な数の船と乗組員を保存することに行き詰まっているため、不明なサイズの配列が必要です。

これは可能ですか?私は、配列へのポインタを持つことが道だと考えました。

私は持っている:

class SaveFileSystem 
{
    string version;
    string UT;
    int activeVessel;
    int numCrew;
    ??? Crews; // !!
    int numVessels;
    ??? Vessels; // !!
}

Crews と Vessels は構造体の配列である必要があります。

struct Crew 
{
    string name;
    //Other stuff
};

struct Vessel
{

    string name;
    //Stuff
};

私は次のようなものが必要だと思います:

    this->Crews = new ???;
    this->Vessels = new ???;

コンストラクターで配列を初期化し、次の方法でアクセスを試みます。

this->Crews[0].name = "Ship Number One";

これは意味がありますか?"???" には "*struct (*)Crews" のようにアスタリスクが混じっていると思いますが、本当のことはわかりません。私は通常のポインターなどを持っていますが、これは私の頭の上に少しあります...最後のスニペットのように構造体にアクセスしたいのですが、C++ がそれを好まない場合は、ポインター演算を行うことができます。

私はベクトルについて調べてきましたが、私は効率性に不健康な執着を持っており、その背後で何が起こっているのかをあなたが知らないことに本当に苦しんでいます.

4

2 に答える 2

8

ベクトルを使用します。ベクターは、動的にサイズ変更可能で、そのサイズを保持する標準 C++ クラスです。ベクトルを使用すると、クラスは次のようになります

class SaveFileSystem 
{
    string version;
    string UT;
    int activeVessel;
    vector<Crew> Crews;
    vector<Vessel> Vessels;
}

ベクトルに対するあなたの不健康な執着は見当違いです。真剣に、それらがあなたがコーディングするものよりも効率的ではないかどうか疑問に思います. あなたのコンパイラの vector の作成者は無能だったと思いますか?

文字列を喜んで使っているようですね。効率性と、舞台裏で何が起こっているのかわからないというあなたの議論が、文字列には当てはまらないのはなぜですか? まったく同じ状況です。

于 2012-09-09T21:30:45.987 に答える
3

std::vector または std::list を使用することは、おそらくより良い (そしてより効率的な) 方法ですが、ポインターや new などを本当に使用したい場合は、次のようにすることができます。

変数の宣言:

Crew* Crews;
Vessel* Vessels;

コンストラクターで:

// initialize numCrew and numVessel before doing this:
this->Crews = new Crew[numCrew];
this->Vessels = new Vessel[numVessel];

その後、必要に応じて配列にアクセスできます。

配列を使い終わったら、次のコマンドでそれらを削除します

delete[] this->Crews;
delete[] this->Vessels;

[] は必須です。

また、ほとんどの場合、"this->" を使用する必要がないことに注意してください。

于 2012-09-09T21:32:20.587 に答える