2016-12-09 7 views
1
class Itembuilder 
{ 
private: 
    int numOfX; 
    int numOfY; 
    int numOfZ; 
    int numOfSpc; 
    int itemMatrix [numOfZ][numOfY][numOfX]; 
public: 
    void build (Space spc, Item item) 
    { 
     numOfX = item.getX()/spc.getX(); //number of space requirement for X origin 
     numOfY = item.getY()/spc.getY(); //number of space requirement for Y origin 
     numOfZ = item.getZ()/spc.getZ(); //number of space requirement for Z origin 

     for (int layer=1; layer<=numOfZ; layer++) // stating layers of item through Z origin 
     { 
      for (int orgY=1; orgY<=numOfY; orgY++) // stating origin Y of a layer 
      { 
       for (int orgX=1; orgX<=numOfX; orgX++) // stating origin X 
       { 
        itemMatrix[layer][orgY][orgX]=0; 
       } 
      } 
     } 
    } 
}; 

こんにちは、私はC++でコーディングするのがとても新しいです。私はドメインに割り当てるための3Dアイテムを構築しようとしています。まず、他のクラスから "item.get"と "spc.get"変数を取得しました。 itemMatrixでユニットを0にすると、私的な変数の非静的条件についてエラーが出ます。どのように私は宇宙ユニットをマトリックスで表現しますか?マトリックス・ビルディングの非静的データ・メンバーの無効な使用

int itemMatrix[numOfZ][numOfY][numOfX]; 

C++を使用して、他のメンバーの宣言にメンバ変数の値を使用することはできません:

は、問題がここにある

1適切おかげ

+5

[mcve]と実際のエラーテキストを含めてください。パラフレーズは重要な細部を失う傾向があります。 – NathanOliver

+0

問題は、コンパイラがオブジェクトのサイズを判断できないことです。 'std :: vector'を使いましょう –

+0

警告:C++の配列は、' int x [size] 'の配列に対して' 0'から 'size - 1'に移動します。したがって、あなたの 'for 'ループは遅く始まり、あまりにも遠くに行きます。 – crashmstr

答えて

1

と私のコードを修正してください。その後

std::vector<std::vector<std::vector<int>>> itemMatrix; 

次のようにコンストラクタでそれを初期化することができます:あなたは、ネストされたベクトルを使用している場合

アレイから3Dマトリックスを作成するプロセスはずっと簡単です

Itembuilder(int numOfX, int numOfY, int numOfZ) 
: itemMatrix(numOfX, std::vector<std::vector<int>>(numOfY, std::vector<int>(numOfZ))) { 
} 

コンストラクタの代わりにベクトルを初期化する他の方法はありますか?

構築時にオブジェクトの一貫性を保つために、ベクターをコンストラクタで初期化する必要があります。ただし、コンストラクターが終了した後にベクトルを再割り当てするオプションがないことを意味するわけではありません。たとえば、行列のサイズを変更するなど、行列を変更する必要がある場合は、ベクトルを再割り当てすることができます。

void changeSize(int numOfX, int numOfY, int numOfZ) { 
    itemMatrix = std::vector<std::vector<std::vector<int>>>(
     numOfX 
    , std::vector<std::vector<int>>(numOfY, std::vector<int>(numOfZ)) 
    ); 
} 
+0

おっと - –

+0

@dasblinkenlightコメントありがとうございましたが、コンストラクタを使用してベクターを初期化すると、スクリプトの正しさを確認するためにmain()でクラスを再度呼び出すことができません。コンストラクタの代わりにベクトルを初期化する他の方法はありますか?私はまた、3d行列を作成した後に値を割り当てる必要があります。私はこの点に立ち往生している – Toghrul

関連する問題