2017-03-12 6 views
0

私は、派生クラスが設定すべき配列を持つ基底クラスを持つことを試みています。アプリケーションはテトリスゲームなので、それぞれのクラス(つまりSquareShape、TShapeなど)が特定の形状の回転に基づいて設定されるローテーションの配列を保持するBaseShapeクラスを用意したいと思います。C++の派生クラスでデータメンバ配列を割り当てる方法は?

class BaseShape 
{ 
    public: 
    BaseShape(); 
    BaseShape(int my_rot[4][5][5]); 
    ~BaseShape(); 

    int rot[4][5][5]; 
    int i_rot; 
}; 

class SquareShape : public BaseShape 
{ 
    public: 
    SquareShape(); 
    ~SquareShape(); 
}; 

私は、Squareメンバークラスの値をSquareShapeクラスに設定したいと考えています。私は、派生クラスのコンストラクタ(配列を割り当てることができないことを学んだこと)をSquareShapeの初期化子リストに設定して(次に、派生クラスの初期化子で基本クラスのメンバーを初期化できないことを学んだ)、および基底クラスのコンストラクタに配列を渡すとエラーでコンパイルに失敗したパラメータにメンバーを初期化:だからこの場合、またはを達成するための方法は、実際に存在する場合、私は思ったんだけど

error: invalid conversion from ‘int (*)[5][5]’ to ‘int’ [-fpermissive] 
    rot{my_rot} 

それについてもっと簡単な方法があります。私は理由はあなた一度、配列なしの例を使用目的に

#include <iostream>  

struct Base { 
    int x; 
    Base(int a) : x(a) {} 
}; 

struct Foo : Base { 
    Foo(int a) : Base(a) {} 
}; 
int main() { 
    Foo f(1); 
    std::cout << f.x << "\n"; 
} 

+0

C-配列はコピー可能でないstd::arrayを使用する場合があり、コピー可能ではありません。 – Jarod42

答えて

1

C-配列は、あなたがのstd ::代わりarray`、あなたは `使用する可能性があります代わりに

using Rot = std::array<std::array<std::array<int, 5>, 5>, 4>; 


class BaseShape 
{ 
    public: 
    BaseShape(); 
    BaseShape(Rot my_rot) : rot(my_rot) {} 
    ~BaseShape(); 

    Rot rot; 
    int i_rot = 0; 
}; 
1

then learned that you cannot initialize a base class' member in the derived class' initializer

は... stricly thatsの真を話すが、その代わりに、直接クラスのメンバを初期化するには、適切なコンストラクタを呼び出すことができますstd::arrayまたはstd::vectorを使用すると、配列の問題はもう発生しません。

関連する問題