コンストラクタ

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

コンストラクタ

#1

投稿記事 by col » 8年前

コード:


#include<stdio.h>
#pragma warning(disable:4996)

class CSuper{
public:
	void human(void);
	void bird(void);
	void input(void);
	void output(void);

	CSuper() :atk(0){
		printf("ATKは%d\n", atk);
	};

	CSuper(int _val) :atk(_val){
		printf("atk入力\n");
	};

private:
	int atk;
};

void CSuper::human(void){
	printf("人\n");
}

void CSuper::bird(void){
	printf("鳥\n");
}

void CSuper::input(void){
	scanf("%d", &atk);
}

void CSuper::output(void){
	printf("ATK:%d\n", atk);
}

int main(void){

	CSuper *Obj;
	Obj = new CSuper;

	printf("1(人):2(鳥)\n");
	int count;

	scanf("%d", &count);
	if (count == 1)
		Obj->human();

	if (count == 2)
		Obj->bird();
		
	printf("初期化? 1はい 2いいえ\n");
	int suu;
	scanf("%d", &suu);

	if (suu == 1){
		CSuper *pt1 = new CSuper(0);
		Obj->input();
		Obj->output();
	}

	if (suu == 2){
		CSuper *pt2 = new CSuper;
	}

	return 0;
}

イニシャライザを使い引数の有無でコンストラクタを使い分けるようにしたいのですが
実行するとATKは0と呼ばれてしまいます。呼ばれないようにどうすればいいか教えてください。

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

Re: コンストラクタ

#2

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

col さんが書きました:実行するとATKは0と呼ばれてしまいます。呼ばれないようにどうすればいいか教えてください。
すいません、「呼ばれないように」の意味がよくわかりません。
printf関数が呼ばれないようにするには、単にprintf関数の呼び出しを消せばいいでしょう。
オブジェクトを作りつつコンストラクタが呼ばれないようにするのは、おそらく不可能でしょう。

入力とそれに対する実現したい出力の例があると、わかりやすいかもしれません。
オフトピック
実行すると呼ばれてしまうので、他に条件無しで呼ばれないようにするには実行しないのが簡単ですね。
実行されないようにするには、このコードとそれからコンパイルされたバイナリを消してしまいましょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

C6b14

Re: コンストラクタ

#3

投稿記事 by C6b14 » 8年前

単純に オーバーロード した コンストラクター を 呼び出して ないだけです。
コンストラクターに引数が ぬけてます。

②atk入力
⑥ATK:123
⑦1(人):2(鳥)

コード:

#include<stdio.h>
#pragma warning(disable:4996)

class CSuper {
public:// 4 Method
	void human(void);
	void bird(void);
	void input(void);
	void output(void);

	CSuper() :atk(0) {  // コンストラクター:initalize
		printf("①ATKは%d\n", atk);// atk=0
	};

	CSuper(int _val) :atk(_val) {  
		printf("②atk入力\n");
	};

private:
	int atk;
};

void CSuper::human(void) {
	printf("③人\n");
}

void CSuper::bird(void) {
	printf("④鳥\n");
}

void CSuper::input(void) {
	scanf("⑤%d", &atk);
}

void CSuper::output(void) {
	printf("⑥ATK:%d\n", atk);
}

int main(void) {

	CSuper *Obj;
	Obj = new CSuper(123);// オーバーロード:コンストラクター

	Obj->output(); // atk=123

	printf("⑦1(人):2(鳥)\n");
	int count;

	scanf("⑧%d", &count);
	

	if (count == 1)
		Obj->human();

	if (count == 2)
		Obj->bird();

	printf("⑨初期化? 1はい 2いいえ\n");
	int suu;
	scanf("A:%d", &suu);

	if (suu == 1) {
		CSuper *pt1 = new CSuper(0);
		Obj->input();
		Obj->output();
	}

	if (suu == 2) {
		CSuper *pt2 = new CSuper;
	}

	return 0;
}

C6b14

Re: コンストラクタ

#4

投稿記事 by C6b14 » 8年前

いまは 例 と して 123 を入れたけど 1 とか 2とか 希望 の値 に すれば いいです。
引数が ないと デフォルト の コンストラクター が 呼び出されます。

C6b14

Re: コンストラクタ

#5

投稿記事 by C6b14 » 8年前

コンストラクターのオーバーロードは 2 つで コンストラクター は 3 つ になります。(デフォルトと①②)
http://csi.nisinippon.com/cpp001.png

なでか C++ では scanf の 挙動が不審 なので std::cin にすると 正しく 動きます。
http://csi.nisinippon.com/cpp002.png

コード:

#include<stdio.h>
#include <iostream>
// #pragma warning(disable:4996)

class CSuper {
public:// 4 Method
	void human(void);
	void bird(void);
	void input(void);
	void output(void);

	CSuper() :atk(0) {  // オーバーロード.コンストラクター:initalize:①
		// printf("①ATKは%d\n", atk);// atk=0
	};

	CSuper(int _val) :atk(_val) { // オーバーロード.コンストラクター:initalize:②
		// printf("②atk入力\n");
	};

private:
	int atk;
};

void CSuper::human(void) {
	printf("③人\n");
}

void CSuper::bird(void) {
	printf("④鳥\n");
}

void CSuper::input(void) {
	//scanf("⑤%d", &atk);
	std::cin >> atk;
}

void CSuper::output(void) {
	printf("⑥ATK:%d\n", atk);
}

int main(void) {

	CSuper *Obj;
	Obj = new CSuper(123);// オーバーロード:コンストラクター

	// Obj->output(); // atk=123

	printf("⑦1(人):2(鳥)\n");
	int count;

	//scanf("⑧%d", &count);
	std::cin >> count;

	printf("count=%d\n", count);

	if (count == 1)
		Obj->human();


	if (count == 2)
		Obj->bird();

	printf("⑨初期化? 1はい 2いいえ\n");
	int suu;
	//scanf("%d", &suu);
	std::cin >> suu;
	printf("suu=%d\n", suu);
	
	if (suu == 1) {
		CSuper *pt1 = new CSuper(0);
		Obj->input();
		Obj->output();
	}

	if (suu == 2) {
		CSuper *pt2 = new CSuper;
	}

	return 0;
}

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

Re: コンストラクタ

#6

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

C6b14 さんが書きました:なでか C++ では scanf の 挙動が不審 なので std::cin にすると 正しく 動きます。
どういうことですか?
まさかとは思いますが、あなたがわざわざ書式として指定した⑤とか⑧とかA:とかを入力していないために数値が読み込まれないのをC++のせいにしている、なんてことは無いですよね?
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

C6b14

Re: コンストラクタ

#7

投稿記事 by C6b14 » 8年前

え、自分 も おかしいとは おもったのですが C は 本当に 初心者 並みなので なおしていただけ ると うれしいです。

C6b14

Re: コンストラクタ

#8

投稿記事 by C6b14 » 8年前

C も C++ も です。C# , VB が 主 だったので。

C6b14

Re: コンストラクタ

#9

投稿記事 by C6b14 » 8年前

あ ごめんなさい。いわれている とうり でした。 printf  と scanf を 混同 してました。 scanf を 使うのは 数えられる ほどしか 無いので 気が付きませんでした でした。C++ さん うそでした。ごめん。m(__)m

C6b14

Re: コンストラクタ

#10

投稿記事 by C6b14 » 8年前

C# では クラスしか 存在しない 世界なので  Main関数 も クラスに 一員 であり 全て クラスで 構成します。基盤 である NET Framework も 全部 クラスでできていて 当たり前 ですが。  それでも この コードは 質問者 の意図は が 変だと 思います。ただの 習作 だとしても もっと 説明がないと ひとを 惑わす ために 作った と思われる 恐れがあります。CSuper と書けば
スーパークラス を 作ろうとしてる 普通は おもいますけど?。     

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: コンストラクタ

#11

投稿記事 by usao » 8年前

newでCSuperオブジェクトを作っている場所が3カ所{ line43, 60, 66 }ありますが,

>実行するとATKは0と呼ばれてしまいます。

として問題視している場所というのは一体どこになるのでしょう…?
オフトピック
No10が何言ってるのか全然わからん…

C6b14

Re: コンストラクタ

#12

投稿記事 by C6b14 » 8年前

いちばんの 問題 は 何行目 でおかしく なるのか に よって 答えが変わります。( いわれてる 通り です )
C# 風には 一番 に おもったのが 人 鳥 を 基本クラス(例えば 生き物  とう スーパークラス) から 継承 する 形 だし( いまも いずれ そうする ための 準備段階 としか思えない )。 そこで 参考にしたのが
http://nb-tech.doorblog.jp/archives/51364027.html です。(CBase  が スーパークラスに 該当)
やはり C++ でも 同じだ と 理解したまでは わかったのですが。 まだ  前段階だと 思うけど どう見ても 4 つの 関数 と 1 変数 の役割 がわかりません。 なにを しようと して こうなった のか まず それを 聞かないと 質問の答え はでない で しょう。

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: コンストラクタ

#13

投稿記事 by usao » 8年前

CSuperが将来的に継承される予定であろうがなかろうが,
質問内容:
 「自分が呼びたいコンストラクタとは別のコンストラクタが呼ばれているっぽくて困る」という話(なんだと思う.)
を考える上ではとりあえずどうでもよい事柄だと思うのですが…?

>4 つの 関数 と 1 変数 の役割

これも同様.


そして,質問者の提示したコードと全く無関係の言語であるC#について
この場でどうのこうのと語る必要性も全くないと思うのだけども.

C6b14

Re: コンストラクタ

#14

投稿記事 by C6b14 » 8年前

そうですね。

閉鎖

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