C++ 継承 値の保持

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

C++ 継承 値の保持

#1

投稿記事 by ダンキヤ » 6年前

昨日似たような質問させていただいたのですが、自分の思っていた問題点が問題の本質とずれていたことに気が付きました。

現在ダンジョンゲームを作っていて、プレイヤーをランダムにスポーンさせるところで詰まっています。
ダンジョンの生成に使用したランダムの部屋の、ランダムの座標を取得する関数があるのですが、それをダンジョンマップの生成後に行うプレイヤーの生成に使おうとしています。
ダンジョン生成はうまくいくのですが、そのあとにプレイヤーの座標を取るために上記の関数を再度呼び出すとすべての値が初期化((?) (RECTを使っているところは変な値が入る)されてしまい、使いまわすことができません。

意図しないタイミングで解放が行われてしまっているのかと思っていたのですが、下記のコードを書いて試してみるとどうやら別のところで理解が及んでいないことに気が付きました。

コード:

#include<iostream>

class Hoge {
protected:
	int x = 10;

public:
	int Func() {
		x += 100;

		return x;
	}
};

class Fuga : public Hoge {
public:
	int y = 20;

	void Func2() {
		y = x;
	}
};

void main() {
	Hoge* hoge;
	Fuga* fuga;

	hoge = new Hoge();

	hoge->Func();

	fuga = new Fuga(); // Func()を呼んで計算した後の、最新の状態を代入する?

	fuga->Func2();
	std::cout << fuga->y << std::endl;

	system("pause");
}
実行結果は10なのですが、110になったxをyに代入できるようにしたいです。

よろしくお願いします。

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 13年前
住所: 北海道札幌市
連絡を取る:

Re: C++ 継承 値の保持

#2

投稿記事 by Dixq (管理人) » 6年前

FugaクラスのFunc2関数でHoge::Func()を呼べば110になります。

コード:

    void Func2() {
        Hoge::Func();
        y = x;
    }
書かれているコードはnew Hogeとnew Fugaのインスタンスが相互に影響することを想定されているのでしょうか?
インスタンスが異なるので相互に影響しあうことはありません。
メンバ変数にstaticメンバ変数を使えば影響しあいますが、それはご法度です。
普通にmain関数内のHoge系の記述がどれも不要です。

# void mainは間違い。int mainと書きましょう

ダンキヤ

Re: C++ 継承 値の保持

#3

投稿記事 by ダンキヤ » 6年前

なるほど、インスタンスが違えば共有は不可能なのですね


今作っているやり方だと、

ダンジョンの情報を生成

情報をもとに床や壁を描画

プレイヤーを描画
(現状用意しているものはこれだけ)

この先敵の描画やアイテムの描画など

といった具合で進めているのですが、座標を取るところから画像の配置まで行わせると管理が大変なので、ダンジョンを作る処理とプレイヤーを作る処理を分けて行っています。
そして、その作られたものを並べるだけクラスを作っています。

ランダムに座標を取る関数はなのですが、ダンジョン生成の方しか持っておらずプレイヤーの方でインスタンス化して使っています。
ですが、そうしてしまうと今回の話の、インスタンスが違うから関数で使う変数の値が変になり、ちゃんと動かないという事になってしまうわけですね。


対処法なのですが、どのようにすればよろしいでしょうか?

ダンジョン生成の部分をすべて継承にしたとして、プレイヤーの座標にスポーンで使用したの座標を与えなければいけないし、そうしたらまたインスタンス化して使わないと生成時に使用した値を取ってこれないし、そうなるとまたインスタンスが違うからまともな値は取ってこれないし……と不慣れなのもあるのか、少し頭がこんがらがってしまっています。

あまり聞きすぎるものよくないとわかってはいるのですが、ご助力いただけますでしょうか。

ダンキヤ

Re: C++ 継承 値の保持

#4

投稿記事 by ダンキヤ » 6年前

私が頭を悩ませて返信を書いている途中に過去の質問の方に書いてくださっていたようですね

バッチリ私のやりたいことを教えていただいていてとても助かりました

コードが多いと読まれなくなるのではと危惧していましたが、返信していただいたときはきちんとコードを書くようにします。

ありがとうございました。

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

Re: C++ 継承 値の保持

#5

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

ダンキヤ さんが書きました:コードが多いと読まれなくなるのではと危惧していましたが、返信していただいたときはきちんとコードを書くようにします。
いいことです。
多いコードは十分な時間とやる気があれば読めますが、無いコードは読めないですからね。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

返信

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