ページ 11

関数でクラスを受け取りメンバ変数を変更する方法について

Posted: 2013年6月23日(日) 23:35
by shiro4ao
ライオンとシマウマのクラスを作り
ライオンがシマウマを食べるということを
表現したいのですが、

コード:

#include <windows.h>
#include <stdio.h>

class Zebra {
public:
	BOOL isLive;
	int Eat();
};


class Lion {
public:
	BOOL isLive;
	int Eat(class Zebra);
};

	int Lion::Eat(class Zebra){
		Zebra.isLive=FALSE;		//この行がエラーになる
		return 0;
	}




int main()
{
	Lion  lion01;
	Zebra zebra01;

	lion01.Eat(zebra01);

	if(zebra01.isLive){
		printf("Zebra is alive");
	}else{
		printf("Zebra is dead");
	}

}
「typedef 'Zebra' の使い方が間違っている」

というエラーが出てしまいます

Lion.Eat()関数でZebra.isLiveフラグを変更するにはどうすればいいのでしょうか?

Re: 関数でクラスを受け取りメンバ変数を変更する方法について

Posted: 2013年6月23日(日) 23:47
by へにっくす
宣言も実装も間違ってます

コード:

int Lion::Eat(Zebra &z){ // class のキーワードは引数に不要。
    z.isLive=FALSE;
    return 0;
}

Re: 関数でクラスを受け取りメンバ変数を変更する方法について

Posted: 2013年6月23日(日) 23:54
by h2so5
いろいろと問題があるような気がするので参考用のコードを貼っておきます。
分からないところがあれば聞いてください。

コード:

#include <cstdio>
 
class Zebra {
public:
    Zebra();
    bool isAlive;
    int Eat();
};
 
Zebra::Zebra() : isAlive(true) {}
 
class Lion {
public:
    Lion();
    bool isAlive;
    int Eat(Zebra *zebra);
};
 
Lion::Lion() : isAlive(true) {}
 
int Lion::Eat(Zebra *zebra)
{
    zebra->isAlive = false;
    return 0;
}
 
int main()
{
    Lion  lion01;
    Zebra zebra01;
 
    lion01.Eat(&zebra01);
 
    if(zebra01.isAlive) {
        printf("Zebra is alive");
    } else {
        printf("Zebra is dead");
    }
}

Re: 関数でクラスを受け取りメンバ変数を変更する方法について

Posted: 2013年6月24日(月) 00:13
by shiro4ao
>へにっくすさん
ありがとうございます
まちがいがたくさあってすみません!
classキーワードは不要なのですね

> h2so5さん
ありがとうございます
変更したいときは参照渡しなのですね

解決方法がわかったので解決とさせて頂きます

それとは話題が変わってしまい恐縮ですが、
isAliveはメンバ変数のつもりでかいたのですが
19行目の
Lion::Lion() : isAlive(true) {}
はなぜこうなっているのでしょうか?

Re: 関数でクラスを受け取りメンバ変数を変更する方法について

Posted: 2013年6月24日(月) 09:29
by usao
>Lion::Lion() : isAlive(true) {}
初期化です.
最初に示されたコードでは変数初期化が無いので
↓のようにメンバ変数の値を参照しようとすると動作が不定となってしまいます.
(特段の理由がないのであれば変数には然るべき初期値を入れておきましょう.)

コード:

Zebra zebra01;
if(zebra01.isAlive)    //おおっと…!
{
    ...
文法的な事柄については”メンバイニシャライザ”で検索でもするとよい解説が見つかるかと思います.

Re: 関数でクラスを受け取りメンバ変数を変更する方法について

Posted: 2013年6月24日(月) 10:33
by shiro4ao
初期化処理だったのですね
ありがとうございます