2011-02-08 5 views
0

私は正しく問題を提起していないかもしれませんが、ここに私の状況です。私は自分のグローバルな機能をすべて入れたい名前空間を持っています。対応する.cppファイルですべてを定義したいと思います。これらの関数の多くは、非グローバルクラスのインスタンスにアクセスします。非グローバルクラスのインスタンスは、ネームスペースのメンバーである場合とそうでない場合があります。クラスを前方宣言できますが、クラスメソッドを呼び出そうとするとリンカーエラーが発生します。これらのグローバルのそれぞれを定義するのは、の後に対応するクラスが定義されていますが、これは異なるファイルに異なる関数を置きます。これを避けたいのですが、これは深刻に間違っているようです。非グローバルクラスにアクセスするグローバル関数をすべて1か所に配置する方法は?

他に何ができますか?私はここで概念的な問題を抱えていると思います。どのような設計戦略がこれを解決するのに役立つでしょうか?対応するクラスの静的メンバーにする必要がありますか?私はこのクラスが好きではありません。クラスには長い名前がありますが、私の名前空間の名前は短いので... typedefを使用しますか?しかし概念的にはこれらはグローバル関数なので、私はそれらをそのままにしておきたいと思っています。

+3

クラスのヘッダファイルを「グローバルな」ソースファイルに単にインクルードするのは間違っていますか? –

答えて

0

私は答えとしてコメントを記入することはできませんので、私はそれを自分で投稿します - 基本的には、Oli Charnesworthは正しく、リファクタリングが解決策でした。私の循環依存関係の問題を引き起こしていた特定のクラスがありました。そして、グローバルな情報に依存しなくなるように物を再読み込みしました。

2

独自のヘッダーファイルに「グローバル関数」を定義します。前方宣言を追加する必要がある場合は、そこで宣言を行います。

.cppファイルには、必要に応じて他の「グローバルではない」クラスと関数のヘッダーを含めます。これにより、パブリックAPIを「クリーン」(ヘッダファイル)に保ちながら、これらの関数の実際のコードで普通に開発することができます。

+0

* .hファイルを十分に含んでいますか?これらの* .hファイル自体は、グローバル名前空間が宣言されている* .hファイルを#includeする必要があるので、奇妙に思えます。とにかく、私は今夜これを試してみる(そして再び投稿する)、ありがとう。 –

+0

@Matt:はい。ヘッダファイルはガードされている必要があります。そのため、タイプは一度しか含まれません。 ... –

+0

@Matt:グローバルな関数のライブラリに依存するクラスがあり、そのクラスに依存している場合は、デザインに問題があるように思えます。リファクタリングを考えてみてください。 –

1

@Oli Charlesworthさんが提案したように、グローバルメソッドのソースファイル内のそれぞれのクラスヘッダーは#includeになりますか?

+0

ええ、私はそれを試みるつもりです。 –

関連する問題