ページ 1 / 1
コンストラクタ
Posted: 2016年11月28日(月) 22:35
by col
コード:
#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と呼ばれてしまいます。呼ばれないようにどうすればいいか教えてください。
Re: コンストラクタ
Posted: 2016年11月28日(月) 23:32
by みけCAT
col さんが書きました:実行するとATKは0と呼ばれてしまいます。呼ばれないようにどうすればいいか教えてください。
すいません、「呼ばれないように」の意味がよくわかりません。
printf関数が呼ばれないようにするには、単にprintf関数の呼び出しを消せばいいでしょう。
オブジェクトを作りつつコンストラクタが呼ばれないようにするのは、おそらく不可能でしょう。
入力とそれに対する実現したい出力の例があると、わかりやすいかもしれません。
オフトピック
実行すると呼ばれてしまうので、他に条件無しで呼ばれないようにするには実行しないのが簡単ですね。
実行されないようにするには、このコードとそれからコンパイルされたバイナリを消してしまいましょう。
Re: コンストラクタ
Posted: 2016年11月29日(火) 00:42
by C6b14
単純に オーバーロード した コンストラクター を 呼び出して ないだけです。
コンストラクターに引数が ぬけてます。
②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;
}
Re: コンストラクタ
Posted: 2016年11月29日(火) 01:00
by C6b14
いまは 例 と して 123 を入れたけど 1 とか 2とか 希望 の値 に すれば いいです。
引数が ないと デフォルト の コンストラクター が 呼び出されます。
Re: コンストラクタ
Posted: 2016年11月29日(火) 08:41
by C6b14
コンストラクターのオーバーロードは 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;
}
Re: コンストラクタ
Posted: 2016年11月29日(火) 09:18
by みけCAT
C6b14 さんが書きました:なでか C++ では scanf の 挙動が不審 なので std::cin にすると 正しく 動きます。
どういうことですか?
まさかとは思いますが、あなたがわざわざ書式として指定した⑤とか⑧とかA:とかを入力していないために数値が読み込まれないのをC++のせいにしている、なんてことは無いですよね?
Re: コンストラクタ
Posted: 2016年11月29日(火) 10:04
by C6b14
え、自分 も おかしいとは おもったのですが C は 本当に 初心者 並みなので なおしていただけ ると うれしいです。
Re: コンストラクタ
Posted: 2016年11月29日(火) 10:07
by C6b14
C も C++ も です。C# , VB が 主 だったので。
Re: コンストラクタ
Posted: 2016年11月29日(火) 10:34
by C6b14
あ ごめんなさい。いわれている とうり でした。 printf と scanf を 混同 してました。 scanf を 使うのは 数えられる ほどしか 無いので 気が付きませんでした でした。C++ さん うそでした。ごめん。m(__)m
Re: コンストラクタ
Posted: 2016年11月29日(火) 12:02
by C6b14
C# では クラスしか 存在しない 世界なので Main関数 も クラスに 一員 であり 全て クラスで 構成します。基盤 である NET Framework も 全部 クラスでできていて 当たり前 ですが。 それでも この コードは 質問者 の意図は が 変だと 思います。ただの 習作 だとしても もっと 説明がないと ひとを 惑わす ために 作った と思われる 恐れがあります。CSuper と書けば
スーパークラス を 作ろうとしてる 普通は おもいますけど?。
Re: コンストラクタ
Posted: 2016年11月29日(火) 13:34
by usao
newでCSuperオブジェクトを作っている場所が3カ所{ line43, 60, 66 }ありますが,
>実行するとATKは0と呼ばれてしまいます。
として問題視している場所というのは一体どこになるのでしょう…?
オフトピック
No10が何言ってるのか全然わからん…
Re: コンストラクタ
Posted: 2016年11月29日(火) 14:31
by C6b14
いちばんの 問題 は 何行目 でおかしく なるのか に よって 答えが変わります。( いわれてる 通り です )
C# 風には 一番 に おもったのが 人 鳥 を 基本クラス(例えば 生き物 とう スーパークラス) から 継承 する 形 だし( いまも いずれ そうする ための 準備段階 としか思えない )。 そこで 参考にしたのが
http://nb-tech.doorblog.jp/archives/51364027.html です。(CBase が スーパークラスに 該当)
やはり C++ でも 同じだ と 理解したまでは わかったのですが。 まだ 前段階だと 思うけど どう見ても 4 つの 関数 と 1 変数 の役割 がわかりません。 なにを しようと して こうなった のか まず それを 聞かないと 質問の答え はでない で しょう。
Re: コンストラクタ
Posted: 2016年11月29日(火) 15:59
by usao
CSuperが将来的に継承される予定であろうがなかろうが,
質問内容:
「自分が呼びたいコンストラクタとは別のコンストラクタが呼ばれているっぽくて困る」という話(なんだと思う.)
を考える上ではとりあえずどうでもよい事柄だと思うのですが…?
>4 つの 関数 と 1 変数 の役割
これも同様.
そして,質問者の提示したコードと全く無関係の言語であるC#について
この場でどうのこうのと語る必要性も全くないと思うのだけども.
Re: コンストラクタ
Posted: 2016年11月29日(火) 16:03
by C6b14
そうですね。