2011-02-03 5 views
0

私の質問は、あるクラスで定義された別のクラスの友人である2D配列をアクセスして修正する方法です。以下は私の質問に関するいくつかの詳細です:2つのフレンドクラス間の2D配列へのアクセス

class A私は、私の2D配列(ポインタへのポインタ)の適切なスペースを宣言し、割り当てます。

Class A 
{ 
    public: 
    friend class B; 
    long double **u; 
    int fun; 
    void make(); 
}; 
void A::make() 
{ 
    long double **u = new long double *[nx]; 
    for (int i=0;i<nx;i++) 
    u[i] = new long double [ny]; 
    int fun = 9; 
} 

Class AClass Bと友達です。 Class Aで宣言した配列をclass Bで定義された関数で使用する必要があります。私のクラスBは以下の通りです。

class B 
{ 
    public: 
    void get(A*); 
}; 

void B::get(A *pt) 
{ 
    using namespace std; 
    cout << pt->fun; 
    cout << pt->u[0][0]; 
} 

私の2番目のcoutにバスエラーが発生しましたpt->u[0][0]。私は私のu [] []配列にアクセスする必要があるこの設定を使用する簡単な方法はありますか?私はポインタが私の配列の1番目のエントリを指しているので、エラーが出ると思います。したがって、私の2D配列全体がメモリに1行として保存されます(ここで大声で考えています)。私はFortranの人ですので、このことは私にとっては少し新しいものです。

他の有益なスレッドへの助けや "ポインタ"をいただければ幸いです。

ありがとうございました!

アルベルト

+1

あなたが最初 ')(作る'電話したを変更する必要があり、あなたがエラーを取得すると思います... ? –

+1

Uは公開されているので、クラスBがAの友人であるという事実は、実際に問題に関与していません(私が間違っていれば正解)。 – AlexJF

+0

はい、私はmake – Al007

答えて

4

私はA::uは、ローカル変数u、ないメンバーを初期化A::make方法では(初期化されていないため。あなたは

void A::make() 
{ 
    long double **u = new long double *[nx]; // should be just u, or this->u. 
+0

ありがとうございます!これはトリックでした – Al007

0

あなたのコードのいくつかの問題がありますnxnyはどこにも定義されていないようだ、とmakeにあなたがすべてでA::funを初期化していない、あなたの代わりにfunいるという名前のローカル変数を設定しますすぐに範囲外に出る。あなたのエラーについては

エラーがmake()ptに呼び出されていないという事実から生じるように、それ聞こえます。 getに渡すインスタンスでmake()が呼び出されていることを確認してください。そうしないと、配列uは割り当てられません。

+0

私はint main()の中でmake()を呼び出していますが、コードをコンパイルして実行したときに、正しい "cout << pt-> fun"私のコードの一部。ここでは私のクラスのアドレスをget()関数に渡します(私は正しく考えます)。これはコンパイルして画面上に表示する "fun"の正しい値を取得できるからです。 – Al007

関連する問題