2017-03-13 7 views
4

たとえば、markerdisplay.cppファイルがあります。 markerdisplayメンバ関数は以下のコードのようになります。C++(クラス)では、常にヘッダファイルに関数を宣言する必要がありますか?

void MarkerDisplay::setMarkerStatus(MarkerID id, StatusLevel level, const std::string& text) 
     { 
       ..... 
     } 

markerdisplay.cppにメンバー以外の機能を追加できますか?

例えば、

bool validateFloats(const visualization_msgs::Marker& msg) 
     { 
       ... 
     } 

関数validateFloatsメンバ関数ではなく、私はまた、ヘッダファイルに宣言しません。私はvalidateFloats.cppファイル内でこの関数を使用します。

これはいくつかの問題を引き起こす可能性があります。本当?

+1

あなたも、完全に

namespace { bool validateFloats(const visualization_msgs::Marker& msg) { // ... } } 

またちょうど同じ効果を持つべきである翻訳単位でstatic関数を定義する匿名の名前空間に(リンカを含む)ことを隠すことができますプロトタイプのヘッダー(または場合によっては明示的な宣言)のヘッダー、ヘッダーを他のファイルにインクルードするとき、プロトタイプがない場合、リンカーは関数を呼び出すときに関数を見つけることができません。 –

+1

@ShawnicHedgehog "*プロトタイプがない場合、リンカはあなたがそれを呼び出すときに関数を見つけることができません*"これは正確ではなく、 "あなたが呼んだとき"ここで本当に意味をなさない。プロトタイプと宣言の違いは何ですか? –

+0

プロトタイプはすべてスコープに関するものです。私はもう少し明確にすべきだと思います。プロトタイプに関する記述:* .cppファイルで関数を宣言し、*の中にプロトタイプを入れない場合。hppファイル、* .hppファイルのみをインクルードするとコンパイラはその関数をどのように見つけ出すのでしょうか? –

答えて

10

.cpp以外の機能を必要としない場合は、そのファイルで宣言して定義すれば十分です。もちろん、最初に使用する前に宣言する必要がありますが、それが私が考えることができる「問題」です。

ではなく、ではなく、「project-public」の数を減らして関数のすべての用途を見つけることが容易になるため、ヘッダーに関数を宣言してコードを作成することができます。より保守的。

あなたは、ヘッダー内の関数を宣言しない場合、あなたはそれstatic行う必要があります。

static bool validateFloats(const visualization_msgs::Marker& msg); 

または匿名名前空間にそれを置く:偶発避けるために

namespace { 
    bool validateFloats(const visualization_msgs::Marker& msg); 
} 

(優先)クロストランスレーションユニット名の衝突

+1

私は、anaonymous namespaceが道のりだと思います。 'private static'はその実装が本当にリンクしているのを隠すわけではありません。 –

+0

@πάνταῥεῖ全く賛成ですが、C++ 03は依然として広く使われ教えられているので、私は両方を挙げて、 'namespace {}'が好まれていると嘆いています。 –

+0

公正なポイント.... –

6

、私の質問は:私は、例えばmarkerdisplay.cpp内の非メンバ関数を持つことができます...

はい、あなたはそれを行うことができます。

パブリックAPIからの使用を意図していない場合は、実装する翻訳ユニットにその機能を提供することをお勧めします。あなたが使用

static bool validateFloats(const visualization_msgs::Marker& msg) { 
    // ... 
} 
関連する問題