次のコードは合法的なC++ですか?
class Foo
{
class Bar;
void HaveADrink(Bar &bar);
void PayForDrinks(Bar &bar);
public:
void VisitABar(int drinks);
};
class Foo::Bar
{
public:
int countDrinks;
};
void Foo::HaveADrink(Bar &bar)
{
bar.countDrinks++;
}
void Foo::PayForDrinks(Bar &bar)
{
bar.countDrinks = 0;
}
void Foo::VisitABar(int drinks)
{
Bar bar;
for (int i=0; i<drinks; i++) HaveADrink(bar);
PayForDrinks(bar);
}
Visual C ++とGCCはどちらもそれを受け入れますが、コードは私には少し奇妙に思えるので、将来のコンパイラーによって拒否されるのは嫌です。
それでも、このパターンはコンパイル時の依存関係を減らすのに役立つようです。同じcppにあるいくつかの関数間で共有される「コンテキスト」(変数の束)を渡すために使用される構造体を宣言するためによく使用します。このようにして、パブリックインターフェイスに「コンテキスト」定義を導入する必要はありません。