2011-12-14 7 views
1

私は頭がおかしくないような基本的な配列の問題にぶつかっています。オブジェクトメソッドに配列を渡す

私はクラス「StaticDisplayLayer」を持っているし、コンストラクタは2つのパラメータ取り - int型と3つのunsigned short intの配列へのポインタ:

//constructor definition: 
StaticDisplayLayer(int type, unsigned short *displayColor[3]); 

//constructor code: 
StaticDisplayLayer::StaticDisplayLayer(int type, unsigned short *dColor[3]) : DisplayLayer(type) 
{ 
    displayColor = dColor; 
} 

を、私はそのクラスのインスタンスを作成しようとしています使用して、以下の:

unsigned short layerColor[3] = {(unsigned short)255,(unsigned short)255,(unsigned short)255}; 
StaticDisplayLayer myLayer(1, &layerColor); 

私の理解では、& layerColorがlayerColor配列へのポインタがあるが、コンパイラは私に次のエラーを与えているということです

no matching function for call to `StaticDisplayLayer::StaticDisplayLayer(int, short unsigned int (*)[3])' 
Candidates are: 
    StaticDisplayLayer::StaticDisplayLayer(const StaticDisplayLayer&) 
    StaticDisplayLayer::StaticDisplayLayer(GLenum, short unsigned int**) 

私は2番目の候補が私が使用しようとしていることを知っていますが、明らかに私は配列へのポインタの概念を理解していません。誰かがこのコンストラクタやこれを説明するリソースを呼び出す方法について少し光を当てることができれば、私はそれを感謝するだろう - これまでのオンライン検索は本当にあまり効果が上がらなかった。

+0

このために 'std :: vector'を使うことを考えましたか?これらの複雑な構文をすべて使いこなすことができます。 – Naveen

+0

ええ、私はベクトルを使って書き直そうとしていましたが、私が間違っていたことを理解することなく、これを放棄したくはありませんでした。 – TheOx

答えて

5

unsigned short *dColor[3]は、配列へのポインタではなく、ポインタの配列へのポインタです。 [3]は無視され、関数パラメータであるため別のポインタに置き換えられます。つまり、は、崩壊するです。配列へのポインタを作成するには、unsigned short (*dColor)[3]を使用します。これは、サイズが3〜unsigned shortの配列へのポインタです。

unsigned short (&dColor)[3] 

そして、ちょうどlayerColorを渡す:C++での

アンでも良いアイデアは、配列への参照を使用することです。

+0

参照を使用するためのアドバイス。 –

1

&layerColorは、タイプpointer to array of 3 unsigned shortsです。一方、あなたのコンストラクタは、array of three pointers to unsigned shortであるunsigned short *[3]を予期しています。実際には、関数のパラメータ型として、pointer to pointer to unsigned shortです。次元は完全に無視されます。私はあなたが符号なしshortへの単なるポインタを取り、この場合には、それで、少なくとも3つの要素を持つ配列を渡すために、呼び出し側の責任であることをlayerColor

StaticDisplayLayer(int type, unsigned short *displayColor); 

unsigned short layerColor[3] = {255,255,255}; 
StaticDisplayLayer myLayer(1, layerColor); 

注意を渡すためにあなたのコンストラクタのためだった何を意味するかと思います。別の方法としては、関数が

StaticDisplayLayer(int type, unsigned short (&displayColor)[3]); 

によって正確に3 ushortsの配列を取る作ることができるが、この場合には、あなたは動的に割り当てられた配列を渡すことはできません。

私がいますが、C++での一定の基本的な知識を欠いていることに気づくことができないので、私はあなたがgood C++ book

+0

私は注文に関するStroustrupの本を持っています。 – TheOx

+0

@TheOx:LippmanのC++ Primerはうまくいっています。 Stroustupは教科書ではなく、むしろ参考になります –

+0

私はそのコピーを手に入れました。 – TheOx

1

のunsigned short displayColor [3]は、本質的にunsigned short型のポインタの配列または符号なしshort *を言っている読むことをお勧め。

unsigned short layerColor [3]は、符号なしショートポインタの配列ではなく、符号なしshortの配列です。

代わりに色のための構造体またはクラスを作成し、ポインタまたは参照をcolorに渡します。

関連する問題