関数は、基本的にクラスの中に定義するものだと思っていたんですが
以下のように、名前空間内に定義しているコードがありました。
以下のmethod()は、グローバル?に置かれているので
設計的にあまりよくないような気がするのですがどうなんでしょうか?
こういう使い方は問題ないのでしょうか?
namespace AIUEO{
void method();
}
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
こんにちは。
以下のmethod()は、グローバル?に置かれているので
設計的にあまりよくないような気がするのですがどうなんでしょうか?
こういう使い方は問題ないのでしょうか?
実際に問題がないかどうかは使い方によりますが、グローバル関数=悪ではないです。
適切に使えば善です。間違った使い方をすれば他と同じく悪です。
例えば、C#にはグローバル変数やグローバル関数が一見ないように見えますが、実はstatic変数やstatic関数はそれらと事実上同じものです。しかし、特定のクラスに属さないといけないので時として鬱陶しいです。本質的にクラスと無関係な関数を何かのクラスに属させる意味はないですから。
C++のグローバル関数は「フリー関数」と呼ばれることもあります。クラスに縛られないという意味です。
クラスとの関わりが浅いものは、グローバル関数(フリー関数)で書いた方が良いケースが多いと思います。(他にもグローバル関数を使った方が好ましいケースも多々有ります。)
投稿2018/12/25 06:11
総合スコア23272
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/25 06:23
2018/12/25 06:31
0
method関数は、グローバル名前空間ではなく、AIUEO名前空間にあります。ただし、使い方によっては見かけ上(あくまで見かけ上です)あたかもグローバル名前空間にあるように見える場合があります。
c++
1#include <iostream> 2 3namespace AIUEO{ 4 5 class A {}; 6 7 void method(A a){ 8 std::cout << "OK" << std::endl; 9 } 10 11} // namespace AIUEO 12 13int main(){ 14 AIUEO::A a; 15 method(a); 16 return 0; 17}
これはうまく動きます。これはmethodがグローバル名前空間にあるわけではないですが、ADL(Argument Dependent Lookup)という機能によってこのような記述が可能になります。methodの実引数にAIUEOで定義されたクラスを入れたことが肝です。
ADLは、関数名が何か?とコンパイラが探すとき、実引数の型が定義されている名前空間も含めて探すため、AIUEO::method と書かなくともよくなります。
よく見てください。「<<」を使っていますが、operator<< はstd名前空間で非メンバ関数として定義されています。しかし、ADLのお陰でstd名前空間でなくともcoudがstdで定義されているために std::operator<< が呼ばれているのです。
ADLがないと、演算子のオーバーロードはほとんど使い物になりません。
投稿2019/01/13 14:54
総合スコア100
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/01/13 23:37 編集
2019/01/14 07:49
0
グローバル?に置かれている
ではなく、名前空間AIUEOに置かれています。
なので、using namespace AIUEO; 宣言のない場所には不可視になりますd^^
投稿2018/12/25 06:09
総合スコア6851
0
ベストアンサー
こういう使い方は問題ないのでしょうか?
はい、全く問題ありません。たとえば、<cstdio>
ヘッダーでは、printf
などのC言語から存在する関数群もstd::printf
とstd
名前空間に入れてあります。
投稿2018/12/25 06:02
編集2018/12/25 06:03総合スコア145941
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/25 06:14
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。