重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

環境は
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); };
voidA::f(void) { cout << "f in t1.cpp\n"; }
void sub1(void) {
Aa;
a.f();
}
---------------------------------------- t2.cpp
#include<iostream.h>
class A { public: void f(void); };
voidA::f(void) { cout << "f in t2.cpp\n"; }
void sub2(void) {
Aa;
a.f();
}
---------------------------------------- t.cpp
externvoid sub1(void), sub2(void);
void main(void) {
sub1();
sub2();
}

A 回答 (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

この回答への補足

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

補足日時:2004/09/19 07:48
    • good
    • 0

>複数のソースファイルで、同名のクラス、同名のメンバ関数を存在させたい


のですがどうしたらよいでしょうか?

namespaceを使ったらどうですか?
    • good
    • 0
この回答へのお礼

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

お礼日時:2004/09/19 07:50

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

    • good
    • 0
この回答へのお礼

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

お礼日時:2004/09/19 07:50

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

今、見られている記事はコレ!