
環境は
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();
}
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
この回答への補足
namespace というのは初めて知りました。ありがとうございました。
インターネット検索で少し調べてみたところ、私の挙げた例の場合は、
namespace の名前(shuyamakawa さんの例では t1 と t2)は省略できる
ことが分かりました。
(bcc32 で)やってみたところ、期待通りの結果が得られました。
名前をひねり出すのが面倒(ソースファイル名と同じでいいんですけど
・・・)だと思っていたのでこれは有り難い。
No.2
- 回答日時:
>複数のソースファイルで、同名のクラス、同名のメンバ関数を存在させたい
のですがどうしたらよいでしょうか?
namespaceを使ったらどうですか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
今、見られている記事はコレ!
-
弁護士が解説!あなたの声を行政に届ける「パブリックコメント」制度のすべて
社会に対する意見や不満、疑問。それを発信する場所は、SNSやブログ、そしてニュースサイトのコメント欄など多岐にわたる。教えて!gooでも「ヤフコメ民について」というタイトルのトピックがあり、この投稿の通り、...
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
-
なぜ批判コメントをするの?その心理と向き合い方をカウンセラーにきいた!
今や生活に必要不可欠となったインターネット。手軽に情報を得られるだけでなく、ネットを介したコミュニケーションも一般的となった。それと同時に顕在化しているのが、他者に対する辛らつな意見だ。ネットニュース...
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
静的でないメンバ関数の呼び出...
-
多重定義が起きている?--lnk20...
-
(void)0 はどんな意味ですか
-
H8 3664Fのプログラム
-
カノニカルモードの設定について
-
【gcc・cygwin】multiple defin...
-
最適化オプションと LoadLibrar...
-
既定のコンストラクタがありま...
-
メンバ関数(メソッド)をマル...
-
FortranからCの関数を呼ぶ方法
-
C# Controls.Addで動的に配置し...
-
「Aに対するBの割合」と「Aに対...
-
「指定されたキャストは有効で...
-
Enterキーを押されたら次の処理...
-
エクセルで可視セルにのみ値貼...
-
DWORDの実際の型は何でしょうか
-
数字以外が入力されたらエラー...
-
プログラムでの数字につく”f”の...
-
2÷3などの余りについて
-
隣接行列を読み込んで有向グラ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
静的でないメンバ関数の呼び出...
-
既定のコンストラクタがありま...
-
C++にてtemplateで受け取った任...
-
多重定義が起きている?--lnk20...
-
【gcc・cygwin】multiple defin...
-
const_castのつかいどころを教...
-
戻り値を返す関数の前に(void)...
-
C言語 ① 5秒間 1秒間隔で点滅を...
-
C# Controls.Addで動的に配置し...
-
C#でテンキーの操作は可能でし...
-
int main()、void main()、void...
-
C# KeyDownイベントでショート...
-
gcc: incompatible pointer type
-
Notepad++の関数リスト表示の変...
-
(void)0 はどんな意味ですか
-
VC++でGetKeyboardStateがうま...
-
関数ポインタについて
-
void main()って誰が最初?:AN...
-
演算子のオーバーロードでコン...
-
この式の意味
おすすめ情報