[c++]クラスのオブジェクトの使用について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
BP
記事: 11
登録日時: 9年前

[c++]クラスのオブジェクトの使用について

#1

投稿記事 by BP » 9年前

[1]質問点
現在、C++を用いてゲームを制作しようとしています。
ですがクラスを用いたオブジェクト生成で分からない点がありました。
 [1.1] クラスを使いオブジェクトを生成した後、そのクラスのメンバ変数や関数を別のクラスから呼び出すことはできないのでしょうか?
 [1.2] コードはこのように記述しました。必要ないと感じたところは外しています。

コード:

main.cpp
#include "main.h"

Player player = Player();
GameScreen game = GameScreen();

	// while(裏画面を表画面に反映, メッセージ処理, 画面クリア, キー更新)
	while (ScreenFlip() == 0 && ProcessMessage() == 0 &&ClearDrawScreen() == 0)
	{
		switch (modeselect)
		{
			case GAME_MAIN:
				game.stage1();
				break;
		}
	}
	DxLib_End(); // DXライブラリ終了処理
	return 0;

コード:

GameScreen.cpp
#include "main.h"
#pragma once

GameScreen::GameScreen(){}


GameScreen::~GameScreen(){}

void GameScreen::stage1()
{
	player.move();
}

コード:

Player.h
#include "Object.h"
#pragma once
class Player : public Object
{
public:
	Player();
	~Player();
	void move();//Objectクラスで純粋仮想関数として宣言
//このほかに変数xをObjectクラスで宣言しています
};

コード:

#include "main.h"

#pragma once

Player::Player()
{
	y = 250;
}


Player::~Player()
{
}

void Player::move()
{
	if (CheckHitKey(KEY_INPUT_UP))
	{
		if (CheckHitKey(KEY_INPUT_LSHIFT) || CheckHitKey(KEY_INPUT_RSHIFT))
		{
			y -= 2.0;
		}
}
main.hではGameScreen.hやPlayer.hなどのインクルード、Playerクラスが継承しているObjectクラスは純粋仮想関数による関数、変数yの宣言などを行っています。

 [1.3] どのようなエラーやトラブルで困っているか(エラーメッセージが解る場合は記載)
GameScreen.cppにおいて、「moveの左側はクラス、構造体、共用体でなければなりません」、「player: 定義されていない識別子です。」などのエラーが発生し実行できません。

 [1.4] 今何がわからないのか、知りたいのか
 どのようにすればGameScreen.cppからPlayerクラスの関数move(Player.move)を呼び出すことができるでしょうか?
 PlayerクラスをGameScreenクラスに継承すればその場は解決する問題ではありますが、いずれObjectクラスを継承した雑魚敵やボスのクラスを作りたいためその方法を取った場合だと継承などの利点がなくなってしまうように感じています。
 また、今回の件について私のコード事態が誤ったものであり、違う方法をとった方が良いのならどのような記述方法をとれば良いのかを明記してくださると非常に有り難いです。


[3] その他
 ・どの程度C言語を理解しているか
 継承、仮想関数がひとまず終わったところです。ベクターやリストについては手を付けておらず、ポインタもほとんど……
 ・ライブラリを使っている場合は何を使っているか
 DXライブラリを使用しています。

hide

Re: [c++]クラスのオブジェクトの使用について

#2

投稿記事 by hide » 9年前

変数のスコープで調べてみてください。

Playerクラスの生成・保持をGameScreenクラスが受け持つか、GameScreenクラス生成時等に引数でPlayerを渡す方法が考えられますが、
GameScreenクラスがどんな役割なのかは設計者のBPさんにしかわかりませんので、
どんなクラスなのかを書いていただかないと、正しいアドバイスは出来ないでしょう。
必要ないと感じたところは外しています。
他の人に設計の方針が伝わらないとトンチンカンな回答が来る恐れがありますよ。

BP
記事: 11
登録日時: 9年前

Re: [c++]クラスのオブジェクトの使用について

#3

投稿記事 by BP » 9年前

変数のスコープで調べてみてください。
Playerクラスの生成・保持をGameScreenクラスが受け持つか、
よく考えればクラス変数にもスコープがあるのは当然ですよね。
そして入れ子クラスですね。勉強になりました。
GameScreenクラス生成時等に引数でPlayerを渡す方法が考えられますが、
この場合、main.cppでGameScreen game = GameScreen(player)をし、GameScreen.cppや.hのコンストラクタでplayerを入れる……ということでよろしいのでしょうか?
試してみたところやり方が悪い、もしくは私の解釈が間違っていたのかGameScreenクラスのstage1関数のplayer.move();で同じようにエラーを吐かれてしまいます。
GameScreenクラスがどんな役割なのかは設計者のBPさんにしかわかりませんので、
どんなクラスなのかを書いていただかないと、正しいアドバイスは出来ないでしょう。
他の人に設計の方針が伝わらないとトンチンカンな回答が来る恐れがありますよ。
失礼しました……
GameScreenクラスはstage1関数など、ゲーム本編を構成するのに使うクラスです。

pocket
記事: 49
登録日時: 9年前

Re: [c++]クラスのオブジェクトの使用について

#4

投稿記事 by pocket » 9年前

こんばんは。

参考までにクラスについて書きます。
的外れな回答かもしれませんが、御容赦ください。

コード:

#include <iostream>
#include <string>

class hito            //クラス宣言
{
private:
    std::string name;
    int age;
public:
    void setname(std::string name);    //名前を設定するメンバ関数の宣言
    void setage(int age);    //年齢を設定するメンバ関数の宣言
    void disp();        //内容を出力するメンバ関数の宣言
};

void hito::setname(std::string name)    //メンバ関数(setname)の定義
{
    this->name=name;
}

void hito::setage(int age)    //メンバ関数(setage)の定義
{
    this->age=age;
}

void hito::disp()        //メンバ関数(disp)の定義
{
    std::cout << "名前:" << name << std::endl;
    std::cout << "年齢:" << age << std::endl;
}

class temp{
  hito *human;
public:
 //コンストラクタで受け取る 
  temp(hito *human){
  //受け取ったポインタをメンバ関数に代入
    this->human=human;
  }
   
  void disp2(){
        human->disp();
  }
};

int main()
{
    hito yamada;
    yamada.setname("山田一郎");
    yamada.setage(30);
    temp te(&yamada);
    te.disp2();
    //yamada.disp();
}
上記のソースコードでは、tempクラスでhitoクラスの関数を読んでいます。
また、参照渡しにしているので、disp2()から参照元の関数disp()を呼べば、きちんと値が出力されています。

この投稿が理解への一助になれば幸いです。

実行結果
http://melpon.org/wandbox/permlink/6Fk85lvUk3QNKZuc

BP
記事: 11
登録日時: 9年前

Re: [c++]クラスのオブジェクトの使用について

#5

投稿記事 by BP » 9年前

ありがとうございます。
pocketさんの方法を試しては見たのですが、「構文エラー:;が*の前にありません」、「;の前に無効なトークンがあります」を始めとした複数のエラーが大量に出てしまいました……
ただ、おそらく私自身のポインタやクラス、参照渡しに関する知識不足であるためにここからはもう少し自力でそれらの復習をしてみて、再びチャレンジしてみようと思います。
解答してくださった方々、本当にありがとうございました。

閉鎖

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