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

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

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

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

Q&A

解決済

1回答

5003閲覧

C++ メンバ関数の引数で他のクラスの構造体が使えるか

nicoyou

総合スコア129

C++

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

0グッド

0クリップ

投稿2019/08/07 05:54

VC++2017
メンバ関数の引数で他のクラスの構造体は使えますか?
enemy.hをincludeした以下のクラスで500近くのエラーが出る原因はこのコードだけで予測できますでしょうか?

C++

1#pragma once 2#include "Task.h" 3#include "EnemyBullet.h" 4#include "Define.h" 5#include "Enemy.h" 6 7class EnemyBulletPattern : public Task 8{ 9 std::shared_ptr<EnemyBullet> Bullet_; 10 eDifficulty difficulty; 11 12 // 行動なし 13 void shot_pattern00(Enemy::enemy_t enemy); 14 // 向いてる方向にショットを撃つ 15 void shot_pattern01(Enemy::enemy_t enemy); 16 // プレイヤーの方にショットを撃つ 17 void shot_pattern02(Enemy::enemy_t enemy); 18 // ランダムで下のほうに撃つ 19 void shot_pattern03(Enemy::enemy_t enemy); 20 // ランダムで上のほうに撃つ 21 void shot_pattern04(Enemy::enemy_t enemy); 22 // 左右交互に撃つ 23 void shot_pattern05(Enemy::enemy_t enemy); 24 // 青スライム 25 void shot_pattern06(Enemy::enemy_t enemy); 26 // 大炎 27 void shot_pattern07(Enemy::enemy_t enemy); 28 // ミニドラゴン 29 void shot_pattern08(Enemy::enemy_t enemy); 30 // キマイラ 31 void shot_pattern09(Enemy::enemy_t enemy); 32 // プレイヤーにビーム 33 void shot_pattern10(Enemy::enemy_t enemy); 34 // プレイヤーにビーム 3本 35 void shot_pattern11(Enemy::enemy_t enemy); 36 // 連続ビーム 37 void shot_pattern12(Enemy::enemy_t enemy); 38 // 小炎 39 void shot_pattern13(Enemy::enemy_t enemy); 40 // ヘビ娘 41 void shot_pattern14(Enemy::enemy_t enemy); 42 // ドラゴン(ショット) 43 void shot_pattern15(Enemy::enemy_t enemy); 44 // ドラゴン(ファイアー) 45 Enemy::enemy_t shot_pattern16(Enemy::enemy_t enemy); 46 // ドラゴン(ブレス) 47 void shot_pattern17(Enemy::enemy_t enemy); 48 49 void shot_pattern18(Enemy::enemy_t enemy); 50 51 void shot_pattern19(Enemy::enemy_t enemy); 52 53 void shot_pattern20(Enemy::enemy_t enemy); 54 55 56public: 57 EnemyBulletPattern(); 58 virtual ~EnemyBulletPattern(); 59 60 bool update() override; 61 void draw() const override; 62 63 // 敵の弾幕を登録する 64 Enemy::enemy_t enemy_shot_manager(Enemy::enemy_t enemy); 65}; 66 67

C++

1// enemy.hの中身 2#pragma once 3#include <memory> 4#include "Task.h" 5#include "Define.h" 6#include "Item.h" 7#include "EnemyBulletPattern.h" 8 9class Enemy : public Task 10{ 11public: 12 typedef struct 13 { 14 game_object_t data; 15 bool screen_flag; // 画面内フラグ 16 int jump_flag; // ジャンプフラグ 17 bool hp_bar_flag; // HPバーを表示するかどうかのフラグ 18 int count_r; // 初期値がランダムなカウンタ 19 int pattern; // 移動パターン 20 int shot_pattern; // 攻撃パターン 21 int shot_kind; // 弾の種類 22 int muki; // 向き 23 int kind; // 敵の種類 24 float out_damage; // 接触ダメージ 25 int muteki; // 無敵時間 26 int item; // 落とすアイテム 27 int img; // 画像 28 int d_effect; // やられた時のエフェクトの種類(0=なし 29 int back_kind; // 背景のエフェクトの種類(0=なし 30 float back_size; // 背景のエフェクトの追加の大きさ 31 float speed; // スピード 32 float jump; // ジャンプ力 33 float gravity; // 重力 34 float dr_lx, dr_rx; // キャラの描画サイズ X 35 float dr_upy, dr_uny; // キャラの描画サイズ Y 36 float laser_angle[10]; // レーザーの角度 37 } enemy_t; 38 39private: 40 enemy_t enemy_[Define::ENEMY_MAX]; 41 static enemy_t base_parameter[100]; // 各敵の詳細パラメータ 42 static bool load_flag; // パラメータを読み込んだかどうか 43 static int parameter_max; // 基本パラメータの種類の数 44 45 std::shared_ptr<Item> Item_; 46 std::shared_ptr<EnemyBulletPattern> EnemyBulletPattern_; 47 48 // 敵をパターンに沿って動かす 49 void enemy_move_pattern(int n); 50 51 int debug_flag[20] = { 1 }; 52 53public: 54 Enemy(); 55 virtual ~Enemy(); 56 57 bool update() override; 58 void draw() const override; 59 60 // 引数の情報の敵情報を登録する 61 void set_enemy(float X, float Y, int Kind, int Level, int Muki); 62 // 敵にダメージを与える 63 void add_damage_to_enemy(int n, game_object_t dat); 64};

エラー↓(一部)
重大度レベル コード 説明 プロジェクト ファイル 行 抑制状態
エラー C3646 'shot_pattern16': 不明なオーバーライド指定子です th_act_remake c:\users\nicoyou\documents\visual studio 2017\projects\th_act_remake\th_act_remake\enemybulletpattern.h 45
エラー C2238 ';' の前に無効なトークンがあります。 th_act_remake c:\users\nicoyou\documents\visual studio 2017\projects\th_act_remake\th_act_remake\enemybulletpattern.h 45
エラー C2238 ';' の前に無効なトークンがあります。 th_act_remake c:\users\nicoyou\documents\visual studio 2017\projects\th_act_remake\th_act_remake\enemybulletpattern.h 64
エラー C2238 ';' の前に無効なトークンがあります。 th_act_remake c:\users\nicoyou\documents\visual studio 2017\projects\th_act_remake\th_act_remake\enemybulletpattern.h 45
エラー C2238 ';' の前に無効なトークンがあります。 th_act_remake c:\users\nicoyou\documents\visual studio 2017\projects\th_act_remake\th_act_remake\enemybulletpattern.h 64
エラー C2238 ';' の前に無効なトークンがあります。 th_act_remake c:\users\nicoyou\documents\visual studio 2017\projects\th_act_remake\th_act_remake\enemybulletpattern.h 45
エラー C2238 ';' の前に無効なトークンがあります。 th_act_remake c:\users\nicoyou\documents\visual studio 2017\projects\th_act_remake\th_act_remake\enemybulletpattern.h 64
エラー C2238 ';' の前に無効なトークンがあります。 th_act_remake c:\users\nicoyou\documents\visual studio 2017\projects\th_act_remake\th_act_remake\enemybulletpattern.h 45
エラー C2238 ';' の前に無効なトークンがあります。 th_act_remake c:\users\nicoyou\documents\visual studio 2017\projects\th_act_remake\th_act_remake\enemybulletpattern.h 64
エラー C2238 ';' の前に無効なトークンがあります。 th_act_remake c:\users\nicoyou\documents\visual studio 2017\projects\th_act_remake\th_act_remake\enemybulletpattern.h 45
エラー C2238 ';' の前に無効なトークンがあります。 th_act_remake c:\users\nicoyou\documents\visual studio 2017\projects\th_act_remake\th_act_remake\enemybulletpattern.h 64
エラー C2238 ';' の前に無効なトークンがあります。 th_act_remake c:\users\nicoyou\documents\visual studio 2017\projects\th_act_remake\th_act_remake\enemybulletpattern.h 45
エラー C2238 ';' の前に無効なトークンがあります。 th_act_remake c:\users\nicoyou\documents\visual studio 2017\projects\th_act_remake\th_act_remake\enemybulletpattern.h 64
エラー C2238 ';' の前に無効なトークンがあります。 th_act_remake c:\users\nicoyou\documents\visual studio 2017\projects\th_act_remake\th_act_remake\enemybulletpattern.h 45
エラー C2238 ';' の前に無効なトークンがあります。 th_act_remake c:\users\nicoyou\documents\visual studio 2017\projects\th_act_remake\th_act_remake\enemybulletpattern.h 64
エラー C2238 ';' の前に無効なトークンがあります。 th_act_remake c:\users\nicoyou\documents\visual studio 2017\projects\th_act_remake\th_act_remake\enemybulletpattern.h 45
エラー C2238 ';' の前に無効なトークンがあります。 th_act_remake c:\users\nicoyou\documents\visual studio 2017\projects\th_act_remake\th_act_remake\enemybulletpattern.h 64
エラー C2238 ';' の前に無効なトークンがあります。 th_act_remake c:\users\nicoyou\documents\visual studio 2017\projects\th_act_remake\th_act_remake\enemybulletpattern.h 45
エラー C2238 ';' の前に無効なトークンがあります。 th_act_remake c:\users\nicoyou\documents\visual studio 2017\projects\th_act_remake\th_act_remake\enemybulletpattern.h 64
エラー C2238 ';' の前に無効なトークンがあります。 th_act_remake c:\users\nicoyou\documents\visual studio 2017\projects\th_act_remake\th_act_remake\enemybulletpattern.h 45
エラー C2238 ';' の前に無効なトークンがあります。 th_act_remake c:\users\nicoyou\documents\visual studio 2017\projects\th_act_remake\th_act_remake\gamelib.cpp 2319
エラー C2653 'Enemy': 識別子がクラス名でも名前空間名でもありません。 th_act_remake c:\users\nicoyou\documents\visual studio 2017\projects\th_act_remake\th_act_remake\enemybulletpattern.h 13
エラー C2653 'Enemy': 識別子がクラス名でも名前空間名でもありません。

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

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

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

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

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

y_waiwai

2019/08/07 06:06

自分でなんのエラーか探ることはしないんでしょうか。
nicoyou

2019/08/07 06:07

もちろん色々調べたうえで分からなかったため、質問しています
y_waiwai

2019/08/07 06:11 編集

ならそのいろいろ調べたことを書いて、その不明点を聞きましょうな。 この質問はエラーメッセージさえ読もうとせずに他人に聞いてるだけ、としか見えません > enemy.hをincludeした以下のクラスで500近くのエラーが出る原因はこのコードだけで予測できますでしょうか? これでは色々調べたとはおもえませんねw
nicoyou

2019/08/07 06:18

エラーコードから調べてもヘッダに書いてる内容と全く違うエラーだった為ですよ 最初から決めつけてくる態度からしても突っかかりたいだけだとしか思えないので、これ以降は無視させていただきますね
fana

2019/08/07 06:58

別に擁護するわけじゃないですが, > 'Enemy': 識別子がクラス名でも名前空間名でもありません。 私は問題の原因をコレから推測しましたけども,循環includeの問題を知らない状態から「Enemyって何やねん」って何で言わちゃうのコレ?という原因にたどり着くのはなかなかに難しいように思います.
guest

回答1

0

ベストアンサー

2つの提示コードのうち上側は,EnemyBulletPattern.h なのでしょうか?
もしそうであれば,2つのヘッダが互いにincludeし合う形になっていることが問題の要因かと思います.

投稿2019/08/07 06:09

fana

総合スコア11654

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

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

nicoyou

2019/08/07 06:10

>2つの提示コードのうち上側は,EnemyBulletPattern.h なのでしょうか? すみません、書き忘れていました その通りです >もしそうであれば,2つのヘッダが互いにincludeし合う形になっていることが問題の要因かと思います. ありがとうございます、確認してきます
fana

2019/08/07 06:26

どこかのcppで #include "Enemy.h" と書いてあるとき, Enemy.hの先頭(class Enemyの定義より前)でEnemyBulletPattern.hをincludeしているから →class EnemyBulletPatternの定義時点ではEnemyという型は未解決なのでエラー,的な流れでしょう.
fana

2019/08/07 06:30

enemy_t ← これをEnemyの内部型にする特別な理由が無いなら,独立させればすっきりするのでは. あと,この話には直接は関係ないですが,C++で typedef struct {...} enemy_t; という形でわざわざ無名の構造体にする意義は特に無い(前方宣言ができなくて不利になるだけ)と思うので,単に struct enemy_t {...}; と書いたら良いんじゃないかなぁ,とか.
nicoyou

2019/08/07 06:31

ヘッダファイルが循環するんですね... ありがとうございました 正しいやり方かどうかはわかりませんが、解決方法を下に残しておきます #include "EnemyBulletPattern.h" を、削除して class EnemyBulletPattern; と、変更し、Enemy.cppで#include "EnemyBulletPattern.h"するように変更しました
nicoyou

2019/08/07 06:34

すみません、頂いた返信を見る前に上の返信を書きました 無視したわけじゃないですm(__)m
fana

2019/08/07 06:36

一方の側のincludeをやめて前方宣言で済ませる,ですね. 問題としているエラーに対する解決手段としては妥当と思います.
nicoyou

2019/08/07 06:38

>Enemy.hの先頭(class Enemyの定義より前)でEnemyBulletPattern.hをincludeしているから >→class EnemyBulletPatternの定義時点ではEnemyという型は未解決なのでエラー,的な流れでしょう 確かにおかしいですね... 全く気が付きませんでした( ̄▽ ̄;) >enemy_t ← これをEnemyの内部型にする特別な理由が無いなら,独立させればすっきりするのでは. おっしゃる通りです、特別な理由はありません >struct enemy_t {...}; 知りませんでした。 わざわざ教えていただいてありがとうございます。 全て書き直しておきますm(__)m
fana

2019/08/07 06:41

>全て書き直しておきます 「書き直す必要が生じたならば」書き直せば良いのではないでしょうか. (必要性が無いならそのままでも良いわけなので)
nicoyou

2019/08/07 06:41

>一方の側のincludeをやめて前方宣言で済ませる,ですね. このやり方が出来ることも元から知っていたわけじゃないのですが... この方法でも大丈夫なんです クラスの中にあったほうが分かりやすそうなので、こちらの方法にしようと思いますm(__)m
nicoyou

2019/08/07 06:46

>「書き直す必要が生じたならば」書き直せば良いのではないでしょうか. 上位互換があるならば、せっかく教えていただいたので修正しておいたほうがいいかなぁと思いました... 小さなプロジェクトで手間はかからないので...(書く必要なかったですね、すみません(-_-;)) まぁどちらにせよ今後構造体を使うときは気を付けるようにしますm(__)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問