どのオブジェクトにも依存しない一連のメソッドを作成するにはどうすればよいですか (私のファイルには、クラス、オブジェクト、メイン、メソッド以外はありません) すべてが 1 つの cpp/hpp ファイルにあり、それらを宣言する方法はありますか?
6 に答える
を作成しますnamespace
。このようなもの:
Utils.h
namespace Utils
{
void myMethod();
}
Utils.cpp
namespace Utils
{
void myMethod()
{
//Implementation
}
}
それらを公開したい、つまり複数の翻訳単位で利用できるようにしたい場合は、それらを に含めnamespace
、ヘッダーで宣言し、単一の実装ファイルで実装するのが最善の方法です。
//functions.h
namespace MyFunctions
{
void foo();
void goo();
}
//functions.cpp
namespace MyFunctions
{
void foo() {}
void goo() {}
}
重要
ヘッダーで定義を提供する場合は、それらをマークする必要がありますinline
。そうしないと、そのヘッダーを複数の翻訳単位に含めると、リンカー エラーが発生する可能性があります。
//functions.h
inline void foo() {
//..
}
inline void goo() {
//..
}
それらを翻訳単位でのみ使用できるようにする場合は、匿名名前空間の実装ファイルで定義します (またはそれらを宣言しますstatic
)。
//fileThatUsesFunctions.cpp
namespace
{
void foo() {}
void goo() {}
}
それらを名前空間に配置する必要があります。ナビーンの例はまさにその通りです。
追加のメモとして、名前空間内で特定の関数またはデータ ユニットを非表示にする (それによって「プライベート」アクセスを模倣する) 場合は、それらの関数およびデータ ユニットを親名前空間内にネストされた匿名名前空間に配置します。例えば:
namespace Foo
{
publicFunction1();
publicFunction2();
namespace
{
privateFunction1();
std::vector<Bar> privateData;
}
}
ネストされた匿名の名前空間内のアイテムは、親の名前空間内のアイテムにのみアクセスできます。これは非常に便利であることがわかりました。
自由な関数を書くことを妨げるものは何もありません。関数がグローバルであるべきだと思うなら、フリー関数は非常に適切です。
オブジェクトに依存しない関数を定義するには、それらを直接宣言するだけです。
// MyFile.h
int some_function();
// MyFile.cpp
int some_function() {
return 42;
}
ただし、名前空間で宣言することをお勧めしますが、C++ を使用します。これはオブジェクトへの依存を与えませんが、グローバル名前空間の汚染を減らします
// MyFile.h
namespace MyNamespace {
int some_function();
}
// MyFile.cpp
using MyNamespace;
int some_function() {
return 42;
}
で行うのと同じ方法で宣言しますC
。名前空間内または名前空間外にすることができます。彼らがクラスにいないという事実以外に違いはありません。
C
後で関数を使用する場合は、先頭に を追加する必要がありextern "C"
ます。
extern "C" void foo();