- ベストアンサー
別ソースファイル、同クラス名、同メンバ関数名で片方の関数しか呼ばれない
環境は 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(); }
- みんなの回答 (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
その他の回答 (2)
- gimmick
- ベストアンサー率49% (134/270)
>複数のソースファイルで、同名のクラス、同名のメンバ関数を存在させたい のですがどうしたらよいでしょうか? namespaceを使ったらどうですか?
お礼
namespace というのは初めて知りました。ありがとうございました。
- elmclose
- ベストアンサー率31% (353/1104)
「複数のソースファイルで、同名のクラス、同名のメンバ関数を存在」させてしまうと、関数名が解決できなくなるので、どちらのソースファイルで定義されているメンバ関数が優先されるか、所定の規則に従って決まっているのではないでしょうか。
お礼
コメント、ありがとうございました。
補足
namespace というのは初めて知りました。ありがとうございました。 インターネット検索で少し調べてみたところ、私の挙げた例の場合は、 namespace の名前(shuyamakawa さんの例では t1 と t2)は省略できる ことが分かりました。 (bcc32 で)やってみたところ、期待通りの結果が得られました。 名前をひねり出すのが面倒(ソースファイル名と同じでいいんですけど ・・・)だと思っていたのでこれは有り難い。