2016-07-06 7 views
0

は、あなたが同じ内容を持つ2つの実装のソースファイルを持っていると仮定しましょう:正常な機能(ないメンバメソッド)を実装(静的グローバル関数のような)メンバ関数の隠された実装

// foo{a,b}.cpp 
class Foo { 
public: 
    void bar(); 
} 
void Foo::bar() { std::cout << "bar\n"; } 

、私は単純に、このマークを付けます方法はstaticです。しかし、これはメソッド宣言では異なる意味を持ち、実装時には指定できません。

foob.cppを変更して、両方のファイルをコンパイルして一緒にリンクしているときにリンカーエラーが発生しないようにするにはどうすればよいですか?

+0

オハイオ州...私は「名前空間にインクルードファイルを置く」と言いたかったのですが、次に[this](http://stackoverflow.com/a/9765654/1016716)を読みました。ああ、私は確かに良い答えがあると確信しています。 –

+0

まあ、ここで実際に解決したい問題は完全にはわかりませんが、[pimpl idiom](https://en.wikipedia.org/wiki/Opaque_pointer#C.2B.2B)のようなにおいがします(Fooはすでに公表されていると思われます)。 –

+0

同じ内容の2つの実装ソースファイルをコンパイルするのはなぜですか?重複した定義を避けるために使用したい_oneを条件付きでコンパイルしないのはなぜですか? –

答えて

4

あなたはクラスが外部に表示されませんとだけ、現在の翻訳単位で使用することができ無名の名前空間

// foo{a,b}.cpp 
namespace 
{ 

    class Foo { 
    public: 
     void bar(); 
    } 
    void Foo::bar() { std::cout << "bar\n"; } 
} 

全体を置いてもよいです。

+0

欠点は、 'Foo'の公開インタフェースが失われていることです。私は実際にこれがOPの問題を解決するかどうかはわかりません。 –

+0

これは動作します、ありがとう! :) @πάνταῥεῖ私はあなたが 'Foo'が公共のインターフェースを失うことによって何を意味するのか分かりません。 'namespace {}'で囲みたいものは 'foob.cpp'ファイルの中で宣言されて使われます。 –

0

通常の解決策は、Foo::bar()の定義をfoob.cppから削除することです。

関連する問題