2016-11-19 7 views
1

私は学校向けのC++プロジェクトで作業していましたが、オブジェクトの2D配列に関してはいくつか問題が発生しました。だから私は、次のクラスがあります。C++別の関数で使用する関数から2次元配列のオブジェクトを返す

class mecanice 
{ 
public: 

    mecanice(); 
    ~mecanice(); 
    ... 
protected: 

private: 
    ... 
    MyClass Ob[8][8]; 
}; 

をそして、私はオビには何に基づいてものを行いますいくつかの他のクラスからメソッドで使用できるように、私はオビを返します方法が必要になります。

class doodle 
{ 
public: 
    doodle(); 
    ~doodle(); 
    void do_stuff(MyClass M[8][8]); 
    ... 
protected: 

private: 
    ... 
}; 

私はすべての方法を試してみましたが、それらのすべては通常、ポインタに関連するエラーをコンパイルすることに終わりました。これを行う方法はありますか?

+0

あなたは 'typedef MyClass MyClassArray [8] [8];'を使い、 'Ob'を' MyClassArray'として返そうとしましたか? – Franck

+0

'std :: vector'を使用する – 0x499602D2

答えて

3

あなたは、アレイは、他のクラスのメソッドに変更されることを望まない場合は、次の

const MyClass (* myMagicMethod())[8] const; 

それとも

typedef const MyClass (*A)[8]; 

//... 

A myMagicMethod() const; 

修飾子constのが使用されてみてください。

もう1つの方法は、参照によって配列を渡すことです。例えば

const MyClass (& myMagicMethod())[8][8] const; 

またはパラメータも参照のように宣言する必要があり、アレイを処理する方法において

typedef MyClass (&A)[8][8]; 

//... 

const A myMagicMethod() const; 

+0

個人的に、私は' typedef MyClass(A)[8] [8]; '(または' typedef decltype(Ob)A; ')を使用し、' const A& '関数が参照を返すことを明確にするために使用されます(typedefは必要に応じてローカル変数を宣言するためにも使用できます)。しかし、それは単に個人的な好みです。 –

+0

ありがとうございました。私は、配列を参照渡しするだけで動作するようになりました。私はsytanx '(&MyMethod())[8] [8]'について知らなかったので、私はあらゆる種類のエラーを受けていました。サイドの質問:最後に別の 'const'があるのはなぜですか?私はそこに残しておくとコンパイルエラーが出ます(CodeBlocksにMinGWを付けてbtwを使用します)。 –

+0

@GeorgeTodosi私が私の答えで書いたように、あなたはtypedefを使って構文を単純化することができます:) –

0

関数から配列を返すことはできません。あなたの場合、次のような機能があります:

MyClass[][] bar(); 

は無効です。

この関数には、戻り値として返す代わりに、パラメータとしてMyClass [] []を使用し、適切に入力することができます。

void bar (MyClass foo[8][8]); 

ます。また、(法的である)の代わりにポインタを返すことができます。

MyClass** bar() { } 

しかし、あなたはへのポインタを返すされているオブジェクトのメモリが永続的であることを確認する必要があります(つまり、ローカル変数などへのポインタを返さないでください)。

関連する問題