2010-12-16 8 views
-1

関数の内部でクラスを定義してお互いを「知る」方法を教えてください。ここで私が理解しようとしているものの大いにダムダウンされたバージョンです。関数内で宣言された相互C++クラス

void foo() { 

    struct A { 
     static void bar() { 
      B::hmm(); 
     } 
    }; 

    struct B { 
     static void hmm() { 
      A::bar(); 
     } 
    } 
} 

A :: bar()はまだBについて何も知らないので、これは動作しません。関数の外では、Bが宣言されるまで、A :: bar()の定義を延期することができます。何かのように:

void foo() { 

    struct A { 
     static void bar(); 
    }; 

    struct B { 
     static void hmm() { 
      A::bar(); 
     } 
    } 

    void A::bar() { 
     B::hmm(); 
    } 
} 

しかし、それは機能の内部で動作していないようです。

これをすべて有効にする賢明なスコープ宣言の代わりに、これはC++ではまったく不可能であるという(決定的な)回答を歓迎します(参照してください)。

「あなたはドン

+0

なぜ名前空間を使用できないのですか? – GWW

+0

@GWW、あなたは私の最後の文章を読まなかった。 – xscott

+0

私はそれを読んだが、なぜあなたが名前空間を使うことができず、関数を使う必要があるのか​​不思議である。 – GWW

答えて

3

...私は(例えば、FOOの外のクラスを宣言する)これを回避するために、他の方法がある知っているので、私は似たような操作を行う方法についての答えを探していませんよt。

ローカルクラスのメンバー関数は、クラス定義内で定義する必要があります。

A::bar()B::hmm()の定義は相互に依存しているため、メンバー関数をクラス定義の外で宣言することはできないため、これが機能するように定義する方法はありません。

(あなたは回避策を探しているわけではありませんが、私の意見では、リモート定義の複雑なクラスを定義したり、多かれ少なかれ複数のクラスを関数定義の中に定義したりしてコードの読みやすさを妨げています。悪い考えです。)

+0

ありがとうございます。基本的に同じことを言うIBMサイトの文書をいくつか見つけました。 「ローカルクラス」というフレーズは、私のGoogle検索で見つからなかったものです。しかし、それはスタイルや可読性についての質問ではありませんでした。その最後のビットを削除すると、私はあなたに答えを与えるでしょう。 – xscott

+2

@xscott:私は可読性についてのコメントが重要だと思います。もちろん、あなたがしたくない場合は、この回答を受け入れないように自由です。 –