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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アバター
shiro4ao
記事: 224
登録日時: 13年前
住所: 広島

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

#1

投稿記事 by shiro4ao » 11年前

ライオンとシマウマのクラスを作り
ライオンがシマウマを食べるということを
表現したいのですが、

コード:

#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フラグを変更するにはどうすればいいのでしょうか?

アバター
へにっくす
記事: 634
登録日時: 12年前
住所: 東京都

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

#2

投稿記事 by へにっくす » 11年前

宣言も実装も間違ってます

コード:

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

アバター
h2so5
副管理人
記事: 2212
登録日時: 13年前
住所: 東京
連絡を取る:

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

#3

投稿記事 by h2so5 » 11年前

いろいろと問題があるような気がするので参考用のコードを貼っておきます。
分からないところがあれば聞いてください。

コード:

#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");
    }
}

アバター
shiro4ao
記事: 224
登録日時: 13年前
住所: 広島

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

#4

投稿記事 by shiro4ao » 11年前

>へにっくすさん
ありがとうございます
まちがいがたくさあってすみません!
classキーワードは不要なのですね

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

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

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

アバター
usao
記事: 1889
登録日時: 11年前

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

#5

投稿記事 by usao » 11年前

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

コード:

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

アバター
shiro4ao
記事: 224
登録日時: 13年前
住所: 広島

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

#6

投稿記事 by shiro4ao » 11年前

初期化処理だったのですね
ありがとうございます

閉鎖

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