関数の中で#if #elif #endif を使いたいのですが、理解できません

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
sign

関数の中で#if #elif #endif を使いたいのですが、理解できません

#1

投稿記事 by sign » 12年前

main内で
Func(1);
と実行したとします。Func関数は下に書きます。
Func関数の中で、引数に応じて異なるクラスを同じ変数名で作成したいのですが、
単純なif文やswitch case文ではローカル変数になってしまい、その外では使えません。
#if文で書こうとしたのですが、引数アリでも無しでも何故かClassAの文、つまり
#if (num == 0)
にしかいけません。

コード:

void Func(int num = 2) {

	#if (num == 0)
	ClassA maker();
	#elif (num == 1)
	ClassB maker();
	#elif (num == 2)
	ClassC maker();
	#else
	ClassD maker()
	#endif

	maker.create();
}	
これの理由と、解決策が知りたいです。
よろしくお願いします。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 関数の中で#if #elif #endif を使いたいのですが、理解できません

#2

投稿記事 by みけCAT » 12年前

#ifとか#elifとか#elseとか#endifはプリプロセッサ命令のため、実行時のnumの値には関係ありません。
解決策は…ごめんなさい、すぐには思いつきません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

derok
記事: 51
登録日時: 12年前

Re: 関数の中で#if #elif #endif を使いたいのですが、理解できません

#3

投稿記事 by derok » 12年前

クラスということはC++ですか?
もしそうなら、ClassA~DクラスがBase Classを継承して、
BaseClassのポインタに代入すればいいのではないのでしょうか?

zxc
記事: 79
登録日時: 13年前
住所: 日本の背骨(?)あたり

Re: 関数の中で#if #elif #endif を使いたいのですが、理解できません

#4

投稿記事 by zxc » 12年前

  異なるクラスを同じ名前で使いたいのならば、共通の基底クラスをそれぞれが継承して、基底クラス型で実体を作ってやればいいのではないでしょうか。もしくはif文やswitch文のreturnで「newしたポインタ等」を返すことになると思います。いずれにしてもそれぞれ子クラスの実体が同時に複数存在しないことになりそうですが。
  型に応じた振る舞いはそれぞれの子クラスに記述したり、type_infoで判断してやれば、なんとかなるかもしれません。

アバター
せんちゃ
記事: 50
登録日時: 14年前
住所: 江別市東野幌町
連絡を取る:

Re: 関数の中で#if #elif #endif を使いたいのですが、理解できません

#5

投稿記事 by せんちゃ » 12年前

プリプロセッサの使い方がそもそも間違っています。
プリプロセッサはコンパイル前に処理されます、当然コードに記述している変数は対象になりません。
numの値によって生成するクラスを変えたい場合は

コード:

void Func( int num = 2 ) {
	Class* maker = NULL;
	switch( num ){
		case 0 : maker = new ClassA(); break;
		case 1 : maker = new ClassB(); break;
		case 2 : maker = new ClassC(); break;
		default : maker = new ClassD(); break;
	}
	maker->create();
}
みたいなのが現実的なのではないでしょうか。
ヽ(*゚д゚)ノ カイバー

sign

Re: 関数の中で#if #elif #endif を使いたいのですが、理解できません

#6

投稿記事 by sign » 12年前

ありがとうございます!
newを使うのですね。考え方が分かって良かったです。
#ifは動的に動かないことを知りました。
重ねて、ありがとうございます。

閉鎖

“C言語何でも質問掲示板” へ戻る