• ベストアンサー

別ソースファイル、同クラス名、同メンバ関数名で片方の関数しか呼ばれない

環境は OS:Windows XP コンパイラ:C++Builder6 に付属の bcc32.exe です。 下の3つのソースファイルがあります。 bcc32 -c t1 bcc32 -c t2 bcc32 t t1.obj t2.obj でできる t.exe を実行すると、 f in t1.cpp f in t1.cpp と出力されます。 リンクエラーになるか、または f in t1.cpp f in t2.cpp と出力されることを期待したのですが・・・。 【質問】 複数のソースファイルで、同名のクラス、同名のメンバ関数を存在させたい のですがどうしたらよいでしょうか? ---------------------------------------- t1.cpp #include <iostream.h> class A { public: void f(void); }; void A::f(void) { cout << "f in t1.cpp\n"; } void sub1(void) { A a; a.f(); } ---------------------------------------- t2.cpp #include <iostream.h> class A { public: void f(void); }; void A::f(void) { cout << "f in t2.cpp\n"; } void sub2(void) { A a; a.f(); } ---------------------------------------- t.cpp extern void sub1(void), sub2(void); void main(void) { sub1(); sub2(); }

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

それぞれのクラスを、違うnamespaceで定義するというのは どうでしょうか? namespaceは(C++では)比較的新しい機能なので、 古いC++コンパイラで動かないかもしれません。 以下、FreeBSD 4.10-RELEASEのgccで動作確認しました。 ---------------------------------------- t1.cpp #include <iostream.h> namespace t1 { class A { public: void f(void); }; void A::f(void) { cout << "f in t1.cpp\n"; } } void sub1(void) { t1::A a; a.f(); } ---------------------------------------- t2.cpp #include <iostream.h> namespace t2 { class A { public: void f(void); }; void A::f(void) { cout << "f in t2.cpp\n"; } } void sub2(void) { t2::A a; a.f(); } ---------------------------------------- t.cpp extern void sub1(void); extern void sub2(void); void main(void) { sub1(); sub2(); } ---------------------------------------- 実行結果 >./t f in t1.cpp f in t2.cpp

gba02077
質問者

補足

namespace というのは初めて知りました。ありがとうございました。 インターネット検索で少し調べてみたところ、私の挙げた例の場合は、 namespace の名前(shuyamakawa さんの例では t1 と t2)は省略できる ことが分かりました。 (bcc32 で)やってみたところ、期待通りの結果が得られました。 名前をひねり出すのが面倒(ソースファイル名と同じでいいんですけど ・・・)だと思っていたのでこれは有り難い。

その他の回答 (2)

  • gimmick
  • ベストアンサー率49% (134/270)
回答No.2

>複数のソースファイルで、同名のクラス、同名のメンバ関数を存在させたい のですがどうしたらよいでしょうか? namespaceを使ったらどうですか?

gba02077
質問者

お礼

namespace というのは初めて知りました。ありがとうございました。

  • elmclose
  • ベストアンサー率31% (353/1104)
回答No.1

「複数のソースファイルで、同名のクラス、同名のメンバ関数を存在」させてしまうと、関数名が解決できなくなるので、どちらのソースファイルで定義されているメンバ関数が優先されるか、所定の規則に従って決まっているのではないでしょうか。

gba02077
質問者

お礼

コメント、ありがとうございました。

関連するQ&A