2017-11-11 14 views
0

私は、このコードを表示するだけでよいことを理解しました。 私はここにゲームという名前のクラスを持っています:レベルを含んでいます。ご覧のとおり、publicコンストラクタには、Lvlタイプのオブジェクトの配列が必要です。コンストラクタの引数としてオブジェクト配列を渡し、渡された配列を別のコンストラクタにコピーする方法

class Game { 
    private: 
     Lvl *_levels[10]; 
    public: 
     Game(Lvl levels[]){ 
      Lvl* _levels=levels; 
      for(int i=0; i<10; i++){ 
       //_levels[i]=levels[i]; 

       cout << endl << "i : " << levels[i].get_stage(); // DOESN'T WORK !! (compiles though) 
      } 
     } 
}; 

そしてメインに、私は次のようしている:私のようにそれを渡ししようとすると、

ので
int main(){ 
    Lvl* lvls[10]={}; 

    for(int i=0; i<10; i++){ 
     lvls[i]=new Lvl(0, 1, 1+i, false); // get_stage() returns the 3rd parameter 
     cout << lvls[i]->get_stage(); //THIS ACTUALLY WORKS AND RETURNS THE CORRECT VARIABLE! 
    } 
    Game game=Game(*lvls); 
} 

を、メイン機能では、Lvlオブジェクトの配列は、完璧に動作しますが、何らかの理由でGameオブジェクトを作成する引数、私はコンストラクタでパラメータを使用することはできません...私がget_stage()しようとすると、乱数を返します!おそらく配列が正しく渡されなかったからでしょうか?

とにかく、これは私のこのサイトの最初の投稿です。私があなたを助けてくれることを願っています。たぶん私はそれに気をつけます:) 何かが不明な場合は、お気軽にお問い合わせください。

+0

With'Lvl * _levelsの=レベルを使用してゲームを構築; 'でコンストラクタはメンバ変数と同じ名前のローカル変数*を定義します。 –

+0

'Game'コンストラクタの引数が' main'変数 'lvls'や' Game :: _ levels'メンバ変数と同じ型でないなど、他の問題があります。それがあなたの現在の問題の原因です。 –

+0

プログラマーの皆さんこんにちは、お返事ありがとうございます。 _levelsとレベルが同じ変数名であることは確かですか?私は通常、メンバー変数の先頭にアンダースコアを使用します... – user8921442

答えて

0

あなたの主な機能には、lvlsというLvlポインターの配列があります。あなたは、

Game game = Game(*lvls); 

を使用してコンストラクタに配列を渡すときにあなたが実際にあなたの最初のLvlオブジェクトへのポインタであることを起こるlvlsの最初のポインタを指すポインタを参照解除しています。したがって、コンストラクタのlevelsには、実際には最初のLvlオブジェクトのアドレスがあり、lvls配列のアドレスはありません。あなたのコンストラクタの宣言は

Game(Lvl levels[]); 

levelsあるのでLvlポインタとして宣言され、これは全体のことを法的になります。コンパイラはエラーをスローしません。その後、

あなただけのポインタを使用して全体のことを行いたい場合は、これは一つの解決策、

class Game { 
    private: 
     Lvl *_levels[10]; 
    public: 
     Game(Lvl* levels[10]){ 
      for(int i=0; i<10; i++) { 
       _levels[i] = levels[i]; 
       cout << endl << "i : " << levels[i]->get_stage(); 
      } 
     } 
}; 

されて、

Game game(lvls); 
+0

ありがとうございます。残念ながら、これまで私が以前に持っていなかったエラーをスローします。コンストラクタGame :: Game(Lvl **): '='トークンの前にunqualified-idが必要です。 '_levels = levels;'これをどのように修正するのか?事があるので_levels'は、ポインタの配列と別の場所に割り当てることができませんリテラル配列として宣言されている 'ので – user8921442

+0

さて、あなたはその割り当てをすることはできません。 '_levels'を' Lvl ** _ levels; 'を使ってポインタへのポインタとして宣言するか、' levels'のポインタを '_levels'にコピーすることができます。私はこれらのポインタをコピーする私の答えを編集しました。 – JerryTheo

0

あなたがゲームをこのように構築する必要があります。このように、そのコンストラクタを宣言次に

Game game(lvls); 

:次に、あなたはで動作するように配列全体へのconst参照を持っています

typedef Lvl Lvls[10]; // Lvls is an array of 10 Lvl objects 
Game(const Lvls& levels) 

、およびアクセスするコードは、main()のコードと同じになります。

関連する問題