クラス間のデータの受け渡し

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

クラス間のデータの受け渡し

#1

投稿記事 by からなや » 7年前

セーブデータを選択してそのデータでゲームを開始するために確認画面を作っています。データ選択画面でファイルからセーブデータを読み込んで3つ並べて表示させてクリックしたデータを確認画面で確定してゲームスタートとしています。
データ選択画面を作るクラスでファイルから読み込んだデータを構造体配列に格納しているのですがその構造体をデータ確認画面を作るクラスから参照する方法はどんな方法があるでしょうか、私の書いたやり方では「静的でないメンバー参照は特定のオブジェクトを基準とする相対参照である必要があります」と出てきてエラーになってしまいます。関係あると思われるコードを載せます、画面遷移は同サイトの「http://dixq.net/g/sp_06.html」を引用しています

DataSelect.h

コード:

 
class DataSelect :public BaseScene
{
private:
	Datas SaveData[3]; //データを読み込む構造体
	Datas *p; //構造体ポインタ
	int DataCount; //読み込んだセーブデータの数をカウント
	int SelectData; //選んだデータの番号

public:
	int Send(Datas*);
}; 

DataSelect.cpp

コード:

#include "DataSelect.h"
#include "DxLib.h"
#include <stdio.h>

void DataSelect::Initialize(){
	Sleep(250); //この画面が動き出すまでに250ms時間を置く
	if ((fp = fopen("SaveData.dat", "rb")) == NULL) {
		//セーブデータがない時ここ
	}
	DataCount = 0;
	for (int i = 0; i < 3; i++) {
		if (fread(&SaveData[i], sizeof(Datas), 1, fp) >= 1) {
			DataCount++;
		}
	}
	fclose(fp);

	p = SaveData;

	SelectData = 0;
}

void DataSelect::Update() {
	//ここでクリックしてSelectDataに選択したデータの番号を入れてデータ確認画面に行きます
}



int DataSelect::Send(Datas *p) {
	p = SaveData;
	return SelectData;
}


DataCheck.h

コード:

//使用するデータの最終確認画面クラス

#include "DataSelect.h"
#include "Data.h"

class DataCheck :public BaseScene
{
private:
	Datas *p; //確認するデータの構造体ポインタ
	int DataNum; //確認するデータの番号
};

DataCheck.cpp

コード:

#include "DataCheck.h"
#include "DxLib.h"


void DataCheck::Initialize() {
	DataNum = DataSelect::Send(p);
}

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

Re: クラス間のデータの受け渡し

#2

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

からなや さんが書きました:データ選択画面を作るクラスでファイルから読み込んだデータを構造体配列に格納しているのですがその構造体をデータ確認画面を作るクラスから参照する方法はどんな方法があるでしょうか
「その構造体」の宣言をヘッダに書き、データ確認画面を作るクラスの宣言の前でそのヘッダをincludeする方法があります。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

かずま

Re: クラス間のデータの受け渡し

#3

投稿記事 by かずま » 7年前

からなや さんが書きました:私の書いたやり方では「静的でないメンバー参照は特定のオブジェクトを基準とする相対参照である必要があります」と出てきてエラーになってしまいます。
普通、エラーメッセージには、どのファイルの何行目のどの名前で
エラーになったと出るはずですが、コンパイラは何ですか?

恐らく、DataCheck.cpp の 6行目の DataSelect::Send(p); の部分で、
そのメッセージが出ているんだと思います。

DataSelect のインスタンス(オブジェクト)は、どこで生成していますか?

DataSelect dataSelect; という宣言があると、
dataSelect.Send(p); で Send が参照できます。

DataSelect *pDataSelect = new DataSelect; という宣言があると、
pDataSelect->Send(p); で Send が参照できます。

他にもおかしなところがあります。
未初期化の DataCheck::p を引数にしていいんですか?
DataSelect::Send() の中で、引数の p の値を無視し、
p = SaveData; で上書きしていますね。

lunnear
記事: 10
登録日時: 7年前

Re: クラス間のデータの受け渡し

#4

投稿記事 by lunnear » 7年前

勝手に補足させてもらいますが、DataSelect.hの11行目を静的関数にすればそのエラーは消えるはずです。

からなや

Re: クラス間のデータの受け渡し

#5

投稿記事 by からなや » 7年前

lunnear さんが書きました:勝手に補足させてもらいますが、DataSelect.hの11行目を静的関数にすればそのエラーは消えるはずです。
その関数にstaticをつけるとその関数を実装するときに使っている変数SaveDataとSelectDataに同じエラーが出てしまいます、その変数にstaticをつけるとその変数が未解決です。というエラーが出てしまいます。

hide

Re: クラス間のデータの受け渡し

#6

投稿記事 by hide » 7年前

まずstaticをつけることの意味を調べてからやりました?

返信

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