🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

C++

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

Q&A

解決済

1回答

3158閲覧

エラーの発生時の原因理解と対処方法

Parsley_068

総合スコア8

Visual C++

Microsoft Visual C++はWindowsのCとC++の統合開発環境(IDE)であり、コンパイラやデバッガを含んでいます。

継承

継承(インヘリタンス)はオブジェクト指向プログラミングに存在するシステムです。継承はオブジェクトが各自定義する必要をなくし、継承元のオブジェクトで定義されている内容を引き継ぎます。

C++

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

0グッド

0クリップ

投稿2019/11/27 17:55

前提・実現したいこと

ここに質問の内容を詳しく書いてください。
C++を使って簡単なゲームを作っています。シーンマネージャークラスを作ってタイトル画面やプレイ画面等の描写をこのクラスに任せるつもりだったのですが、途中からシングルトンにしようと手を加えたらエラーが出てしまい困っています。どうにかしてエラーが出ないように直したいです。

発生している問題・エラーメッセージ

Player* player;に対して c2143 ';'が'*'の前にありません。 c4430 型指定子がありません。 intと仮定します std::list<Cat*>cats;等のlistに対して c2065 Cat,Rabbit,Cancer定義されてない識別子です c2059 構文エラー:'>' list<>::iterator it c2039 'iterator':'grobal namespace'のメンバーではありません c3645 'C_it','R_it'...: 不明なオーバーライド指定子です C2327 'SceneManager::iterator': 型名、スタティック、または列挙子ではありません。 C2086 'unknown-type SceneManager::iterator': 再定義されました。 //SceneManagerクラスを書き直したら消えました C2011 'SceneManager': 'class' 型の再定義 C2027 認識できない型 'SceneManager' が使われています。

該当のソースコード

C++

1class SceneManager 2{ 3private: 4 //描画用ハンドル 5 int title_bcg; 6 int select_bcg; 7 int cursour; 8 int shotgun; 9 int sniper; 10 int pubg; 11 int lock; 12 int stage_1; 13 int stage_2; 14 int stage_3; 15 16 int clear = 2; 17 int stage = 1; 18 19 20public: 21 22 SceneManager() 23 { 24 sequence.change(&SceneManager::play); 25 } 26 27 void title(float t); 28 void select(float t); 29 void play(float t); 30 void stage_select(); 31 void spawn(int limit); 32 33//ここから下がエラーになってしまう 34 Player* player; 35 std::list<Cat*>cats; 36 std::list<Cat*>::iterator C_it; 37 38 std::list<Rabbit*>rabbits; 39 std::list<Rabbit*>::iterator R_it; 40 41 std::list<Cancer*>cancers; 42 std::list<Cancer*>::iterator K_it; 43 44 CSequence<SceneManager>sequence; 45}; 46 47//CancerクラスやRabbitクラスも基本的にはPlayerクラスと一緒 48class Player 49{ 50private: 51 //描画用ハンドル 52 int normal; 53 int move; 54 int snipe; 55 int shot; 56 int jump; 57 int death; 58 int cut; 59 60 int x; 61 int y; 62 int radius = 34; 63 64 65 66 int state = 0; 67 int cooltime = 30; 68 int count = 0; 69 bool wait = false; 70 bool cutin = false; 71 bool cool = true; 72 73public: 74 Player() 75 { 76 sequence.change(&Player::draw_player); 77 x = 100; 78 y = 400; 79 } 80 int* get_X() { return &x; } 81 int* get_Y() { return &y; } 82 83 84 void update(); 85 void draw_player(float t); 86 void Cutin(); 87 88//Playerクラスだとエラーが発生しない 89 Rifle* rifle; 90 91 92 CSequence<Player>sequence; 93}; 94 95//これを継承させようとしてたらエラーが発生し始めた 96template<class T> 97class Singleton 98{ 99public: 100 static inline T& GetInstance() 101 { 102 static T instance; 103 return instance; 104 } 105 106protected: 107 Singleton() {} // 外部でのインスタンス作成は禁止 108 virtual ~Singleton() {} 109 110private: 111 void operator=(const Singleton& obj) {} // 代入演算子禁止 112 Singleton(const Singleton& obj) {} // コピーコンストラクタ禁止 113};

試したこと

シングルトンを継承させようとするまでは問題なく動いたので、シングルトンの基底クラスの継承を止めて一度コードを書き直したりはしました

補足情報(FW/ツールのバージョンなど)

使用しているツールはVisualStudio2019になります。

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

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

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

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

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

guest

回答1

0

ベストアンサー

C++コンパイラは、ソースコードの頭から順番にコードを解析していきます。自分で定義した型や関数などを使うまでに、その型や関数の名前が宣言されていなければ、エラーになります。たとえ、後の方で宣言してあっても、コンパイラはわざわざ後の方まで探してくれません。

上のコードでは、class SceneManagerの定義の中で、いきなりPlayer* player;とPlayerクラスを使おうとしています。しかし、実際の定義は下の方にあって、使用している場所ではまだ不明なのでエラーになっています。

ポインタの変数を定義する場合は、クラスの中身は、まだ必要ないので、名前だけ宣言することができます。class SceneManagerを定義する前に、class Playerの名前を宣言しましょう。

C++

1class Player; 2 3class SeceneManger 4{ 5 // 以下略

Cat,Rabbit,Cancerなども恐らく同じだと思います。

class Player;のような宣言については、「前方宣言」で検索すれば詳しい説明が見つけられると思います。

投稿2019/11/27 18:46

Bearded-Ockham

総合スコア430

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

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

Parsley_068

2019/11/28 16:00

返信おくれてすみません・・・ 言われた通りに前方宣言した所問題なく動きました!ありがとうございます! わかりやすい解説も大変助かりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問