1

どのオブジェクトにも依存しない一連のメソッドを作成するにはどうすればよいですか (私のファイルには、クラス、オブジェクト、メイン、メソッド以外はありません) すべてが 1 つの cpp/hpp ファイルにあり、それらを宣言する方法はありますか?

4

6 に答える 6

4

を作成しますnamespace。このようなもの:

Utils.h

namespace Utils
{
   void myMethod();
}

Utils.cpp

namespace Utils
{
  void myMethod()
  {
    //Implementation
  }
}
于 2012-05-03T17:00:32.240 に答える
2

それらを公開したい、つまり複数の翻訳単位で利用できるようにしたい場合は、それらを に含め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() {}
}
于 2012-05-03T17:00:26.850 に答える
1

それらを名前空間に配置する必要があります。ナビーンの例はまさにその通りです。

追加のメモとして、名前空間内で特定の関数またはデータ ユニットを非表示にする (それによって「プライベート」アクセスを模倣する) 場合は、それらの関数およびデータ ユニットを親名前空間内にネストされた匿名名前空間に配置します。例えば:

namespace Foo
{
    publicFunction1();
    publicFunction2();

    namespace
    {
        privateFunction1();
        std::vector<Bar> privateData;
    }
}

ネストされた匿名の名前空間内のアイテムは、親の名前空間内のアイテムにのみアクセスできます。これは非常に便利であることがわかりました。

于 2012-05-03T17:05:04.677 に答える
1

自由な関数を書くことを妨げるものは何もありません。関数がグローバルであるべきだと思うなら、フリー関数は非常に適切です。

于 2012-05-03T17:03:49.567 に答える
1

オブジェクトに依存しない関数を定義するには、それらを直接宣言するだけです。

// 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;
}
于 2012-05-03T17:00:51.810 に答える
1

で行うのと同じ方法で宣言しますC。名前空間内または名前空間外にすることができます。彼らがクラスにいないという事実以外に違いはありません。

C後で関数を使用する場合は、先頭に を追加する必要がありextern "C"ます。

extern "C" void foo();

于 2012-05-03T17:01:02.163 に答える