2011-08-06 46 views
0

JavaのPHPバックグラウンドから来て、私はC++にしようとしています。私は構造体に配列を格納したいと思います。私の問題は、構造体を初期化した後に配列のサイズを指定することです。主な機能のための構造体、ポインタの配列[C++ Beginner]

struct SpriteAnimation { 
    // ... 
    int parts;     // total number of animation-parts 
    unsigned int textures[]; // array to store all animation-parts 
    // ... 
}; 

そして、ここで:

は、ここに私の構造体のためのコードです

SpriteAnimation bg_anim; 
bg_anim.parts = 3; 
unsigned int *myarray = new unsigned int[bg_anim.parts]; 
bg_anim.textures = myarray; 

私はこの問題を解決するために変更する必要がありますか?

答えて

0
struct SpriteAnimation { 
    // ... 
    int parts;     // total number of animation-parts 
    unsigned int * textures; // array to store all animation-parts 
    // ... 
}; 

type name[]構文は、メンバーをインラインで宣言した場合にのみ使用できます。現代のC++では

+0

「bg_anim.textures = new unsigned int [bg_anim.parts];」と一緒に使用するのは正しいですか? – Ben

+0

構造体をコピーするとどうなりますか?例外があるとどうなりますか? –

+0

@Ben yesは正しく動作します。実際は正しくはありませんでした。これは、テクスチャは動的に割り当てられた配列であり、ポインタとして表示する必要があるからです。 Cスタイルの構文を使用しているときにC++を使用する場合は、クラスをルックアップする必要があります。最後に – Will03uk

9

、あなたは内側の「アレイ」のための動的なコンテナを使用します。

struct SpriteAnimation { 
    std::vector<unsigned int> textures; // array to store all animation-parts 
    size_t num_parts() const { return textures.size(); } 
}; 

これは、手動で割り当てられたストレージを試みることが何よりもはるかに安全かつよりモジュールです。使用法:構造体の

SpriteAnimation x; 
x.textures.push_back(12); // add an element 
x.textures.push_back(18); // add another element 

SpriteAnimation y = x;  // make a copy 

std::cout << "We have " << x.num_textures() << " textures." std::endl; // report 
+2

Downvoterの配列を削除することを忘れないでください。私はこれが「C配列のやり方」ではないことを理解していますが、C++の解決策を求めています.C++を行うための慣用的で道徳的な方法は、例外的で安全なリソース管理と単一責任)コンテナをビルディングブロックとして使用します。 –

+0

これは配列の大きさをどのように知っていますか(または 'vector' - 違いを説明できますか?) 'push_back()'はそれが呼び出されるたびに新しいものを作成することによってサイズを変更しますか?それはジョンの解答に比べてひどく非効率的であるか、何かを誤解していますか? – Ben

+1

@Ben: 'vector'の完全な仕組みを解説することはこのコメントを超えていますが、[読み上げてください](http://www.cplusplus.com/reference/stl/vector/) - はい、' push_back'は行います新しい要素を追加しますが、これは魔法のおかげで償却されたO(1)です。実際、C++標準ライブラリのほとんどは、そのようにしか記述できません。 –

0

サイズはコンパイル時に知られなければなりません。

+0

彼はポインタを使う意味があり、unsigned int *型は静的サイズ – Will03uk

0

次のコードで問題を回避しました。設計上の問題がある可能性がありますので、次のコードを参照してください。

#include <iostream> 
using namespace std; 
struct lol { 
    // ... 
    int parts;     // total number of animation-parts 
    unsigned int *texture; // array to store all animation-parts 
    // ... 
}; 

int main() { 
    // your code goes here 
    lol bg_anim; 
    bg_anim.parts = 3; 
    unsigned int *myarray = new unsigned int[bg_anim.parts]; 
    bg_anim.texture = myarray; 
    return 0; 
} 

lolを使用しての代わりに、あなたは自分のコード内の他の問題がある場合、任意のissues.Andが私を助けて私に教えname.Do指定のための私を許して。 ありがとうございます! :)

+0

ですが、 'struct'は何でもありませんが、すべてのpublicを持つクラスです。もっと良い解決策はクラスを使うことでした。 –

関連する問題