質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

1932閲覧

依存性の注入で外部の構造体のポインタ変数にインスタンスを入れる方法が知りたい

退会済みユーザー

退会済みユーザー

総合スコア0

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/10/16 02:52

編集2020/10/16 04:00

下記のコードの////コメントの内部のコードですが外部のクラス内の構造体のインスタンスを配列のポインタに入れる方法はどうすればいいのでしょうか?型名がありませんや不完全な型など様々エラーが発生してしまいどうすればいいかわかりません。Player::Player();コンストラクタの
for文のコードはどうすればいいのでしょうか?

イメージ説明

cpp

1#ifndef ___PLAYER_HPP_ 2#define ___PLAYER_HPP_ 3 4//自作ヘッダー類 5#include "Sprite.hpp" 6#include "Game.hpp" 7 8//標準ヘッダー関係 9#include "stdio.h" 10#include <fstream> 11#include <sstream> 12#include <iostream> 13#include <vector> 14 15//OpenGL関係 16#include "GLEW/include/GL/glew.h" 17#include "gl/GL.h" 18#include "GLFW/include/GLFW/glfw3.h" 19 20//数学ライブラリ 21#include "glm/ext.hpp" 22#include <glm/ext/vector_int2.hpp> 23//文字描画 ライブラリ 24#include <ft2build.h> 25 26//#include FT_FREETYPE_H 27 28 29 30 31 32//class Game; 33class Player 34{ 35public: 36 37 Player(Game* g); 38 ~Player(); 39 40 void Update(); 41 void Draw(); 42 43private: 44 Game* mOwner; 45 46 ////////////////////////////////// 47 struct BulletData* mBullet[10]; 48/////////////////////////////////////////////// 49 50 bool mIsAttack = false; 51 52 53 54 //プレイヤー 55 enum eKeyInput key; //プレイヤーのキー入力 56 57 Sprite* mSprite[4][2]; 58 glm::ivec2 mPosition; //座標 59 glm::ivec2 mVector; //向き 60 61 62 63 int mAnim = 0; //アニメーション管理 64}; 65 66#endif 67

cpp

1#include "Player.hpp" 2#include "Game.hpp" 3 4Player::Player(Game* g) 5{ 6 mOwner = g; 7//////////////////////////////////////////////////////////////////////////// 8 for (int i = 0; i < 10; i++) 9 { 10 mBullet[i] = mOwner->BulletData{ false,glm::ivec2(0,0),glm::ivec2(0,0) }; 11 12 // mBullet[i] = struct BulletData_{ false, glm::ivec2(0, 0), glm::ivec2(0, 0) }; 13 14 } 15///////////////////////////////////////////////////////////////////////////// 16 17 18 //up 19 mSprite[0][0] = new Sprite(mOwner, "Assets/Player.png", glm::ivec2(0, 0), glm::ivec2(CELL, CELL)); 20 mSprite[0][1] = new Sprite(mOwner, "Assets/Player.png", glm::ivec2(CELL * 1, 0), glm::ivec2(CELL, CELL)); 21 22 //left 23 mSprite[1][0] = new Sprite(mOwner, "Assets/Player.png", glm::ivec2(CELL * 2, 0), glm::ivec2(CELL, CELL)); 24 mSprite[1][1] = new Sprite(mOwner, "Assets/Player.png", glm::ivec2(CELL * 3, 0), glm::ivec2(CELL, CELL)); 25 26 //down 27 mSprite[2][0] = new Sprite(mOwner, "Assets/Player.png", glm::ivec2(CELL * 4, 0), glm::ivec2(CELL, CELL)); 28 mSprite[2][1] = new Sprite(mOwner, "Assets/Player.png", glm::ivec2(CELL * 5, 0), glm::ivec2(CELL, CELL)); 29 30 //right 31 mSprite[3][0] = new Sprite(mOwner, "Assets/Player.png", glm::ivec2(CELL * 6, 0), glm::ivec2(CELL, CELL)); 32 mSprite[3][1] = new Sprite(mOwner, "Assets/Player.png", glm::ivec2(CELL * 7, 0), glm::ivec2(CELL, CELL)); 33 34 35 36 37} 38 39 40 41void Player::Update() 42{ 43 44} 45 46void Player::Draw() 47{ 48 49} 50 51 52 53 54 55 56Player::~Player() 57{ 58 59} 60

cpp

1#ifndef ___GMAE_H_ 2#define ___GMAE_H_ 3 4#define CELL 48 5 6//画面サイズを指定 7#define WIDTH (16 * 70) 8#define HEIGHT (9 * 70) 9#define PI (3.14159265359f) //円周率 10 11 12#define STAGE_HEIGHT 16 13#define STAGE_WIDTH 23 14 15 16//自作ヘッダー 関係 17#include "Camera.hpp" 18#include "Font.hpp" 19#include "Sprite.hpp" 20 21 22//標準ヘッダー関係 23#include "stdio.h" 24#include <fstream> 25#include <sstream> 26#include <iostream> 27#include <vector> 28 29//OpenGL関係 30#include "GLEW/include/GL/glew.h" 31#include "gl/GL.h" 32#include "GLFW/include/GLFW/glfw3.h" 33 34//数学ライブラリ 35#include "glm/ext.hpp" 36#include <glm/ext/vector_int2.hpp> 37//文字描画 ライブラリ 38#include <ft2build.h> 39//#include FT_FREETYPE_H 40 41 42 43//前方宣言 44class Mesh; 45class Sprite; 46class Font; 47 48class Game 49{ 50public: 51 52 Game(); //コンストラクタ 53 bool Initialization(); //初期化 54 bool RunLoop(); //メインループ 55 void Update(); //計算 56 void GenerateOutput(); //描画 57 58 bool mIsRunLoop; //メインループ 59 void KeyInput(); //キー入力 60 61 62 63 //頂点属性 64 struct VertexAttribute { 65 66 GLfloat Position[3]; //頂点座標 67 GLfloat uv[2]; //UV座標 68 69 }; 70 71 72 73//----------------------------------------------------------------描画オブジェクト 74 75 //キューブ 76 std::vector<Game::VertexAttribute> vertex; //頂点 77 std::vector<unsigned int> vertex_index; //インデックス 78 79 //地面 80 std::vector<Game::VertexAttribute> Ground; //頂点 81 std::vector<unsigned int> Ground_index; //インデックス 82 83 84 85 86 87//----------------------------------------------------------------描画オブジェクト 88////////////////////////////////////////// 89 struct BulletData 90 { 91 bool frag; 92 93 glm::ivec2 pos; //弾の座標 94 glm::ivec2 vec; //弾の飛んでいく向き 95 96 }; 97//////////////////////////////////////// 98 99 Sprite* gBullet[4]; 100 101 enum class eKeyInput 102 { 103 Up, 104 Down, 105 Left, 106 Right, 107 Invalid, 108 }; 109 110 111 //マップ 112 Sprite* Map[100]; 113 114 115 116 int stage[STAGE_HEIGHT][STAGE_WIDTH] = 117 { 118 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 119 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 120 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 121 {0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 122 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 123 {0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0}, 124 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0}, 125 {0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0}, 126 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 127 {0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0}, 128 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 129 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}, 130 {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0} 131 132 133 134 }; 135 136 137 138 139 140 Font* font; 141 142 143...関係ないので省略 144 145};

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/10/16 02:58

どのようなコンパイルエラーが出たのですか?
退会済みユーザー

退会済みユーザー

2020/10/16 03:09

質問内容を編集しました。
KoichiSugiyama

2020/10/16 04:58

Gameクラスにstruct BulletDataの定義しか書いてないようのですが、メンバ変数は省略部分にあるのでしょうか?あるのでしたらその部分も省略せずに書いてください。
退会済みユーザー

退会済みユーザー

2020/10/16 05:13

いえ。そのGaneクラスにあるBulletData構造体をPlayerクラスで作りたいということなのでしょすが何が間違えてるのでしょうか?
KoichiSugiyama

2020/10/16 05:31

だとしたら、mOwner->BulletDataの書き方はおかしいですよね。書くならGame::BulletDataとすべきでは?
dodox86

2020/10/16 05:45

KoichiSugiyamaさんのコメントに更に付け加えれば、 > mBullet[i] = mOwner->BulletData{ false,glm::ivec2(0,0),glm::ivec2(0,0) }; 今、提示の class Player {} 内のmBulletは、struct BulletData* mBullet[10]; と宣言してます。 Playerクラス内で struct BulletData* mBullet[10]; とメンバー変数の宣言はできないはずなのでは。クラスに属さないstruct BulletData構造体があるのですか? fanaさんの回答は、それを示しているのでは? 質問中に載せるために編集したのかもしれませんが、何かちょっと無茶苦茶です。
fana

2020/10/16 06:27

> //class Game; というコメントアウトされた行が Player の定義の手前に見えるところから想像するに,何か前方宣言ぎみな記述をしようとした痕跡なのかも? > struct BulletData* mBullet[10]; (内部型を前方宣言できるのかは知りませんが)
guest

回答1

0

ベストアンサー

class Player { .... struct BulletData* mBullet[10]; //← .... };

ここの BulletData は, Gameクラスの内部構造体である Game::BulletData とは異なる.

Game::BulletData 型を意図しているのであれば,素直に Game::BulletData という型名を用いればよい.

class Player { .... Game::BulletData* mBullet[10]; .... };

投稿2020/10/16 05:21

編集2020/10/16 05:44
fana

総合スコア11996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/10/16 06:10

なるほど。Game.hppにあるものではないのでこれは確かに違います。というのを確認出来ました。
fana

2020/10/16 06:19 編集

struct BulletData* mBullet[10]; だと, 「BulletDataっていうstructがどっかに( Playerを定義している名前空間に,かな?)あってさー,そいつを指すポインタ型の配列なんだよね」という意味になる. すなわち,コンパイラに 「(Game::BulletDataとは別の)struct BulletData の宣言」と解釈されている. で,実際にはそんな BulletData 型の定義が存在しないので「不完全な型がどうの」というエラーになっている.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問