1

スタックオーバーフローに投稿するのはこれが初めてなので、うまくいけば、これはすべてのエチケットを守っています!

有限状態マシンを使用する個人プロジェクトで使用するために、SDL1.x拡張ライブラリを使用してC++でボタンクラスを作成および実装しようとしています。仮想関数「Button」、Buttonから派生したクラス、「MenuButton」、およびMenuButtonを作成しようとする「Title」状態を持つ基本クラスがあります。

私はMicrosoftVisualStudio 2012を使用していますが、Intellisenseは私のコードが正しいと言っています。ただし、コンパイルしようとすると、次の2つのエラーが発生します。

title.h(35):エラーC2143:構文エラー:';'がありません 前 '*'

title.h(35):エラーC4430:型指定子がありません-intと見なされます。注:C++はdefault-intをサポートしていません

私は自分で問題を理解しようと数時間を費やしました。私はグーグルを検索し、stackoverflowも検索しましたが、同様の問題を抱えている他の多くの投稿を見たり読んだりしましたが、どれも私と同じ問題を抱えているようには見えませんでした。

他の人によって投稿された他の同様の問題と彼らの受け入れられた答えに基づいて、私はすでに検索しました:#includeループの問題、クラス宣言に最後の;があることを確認し、すべての#includeが含まれていることを確認します(私が知っている) 。

コードスニペットは以下のとおりです。誰かがこれを解決する方法を教えてくれれば、私は知恵と支援に感謝します。

ありがとうございました

Button.h(基本クラス)

#ifndef BUTTON_H
#define BUTTON_H

#include "SDL.h"
#include "SDL_image.h"
#include "SDL_ttf.h"
#include "Functions.h"
#include "Globals.h"
#include "Constants.h"
#include <string>

using namespace std;

class Button
{
public:
    virtual void handleEvents() = 0;

    virtual void render() = 0;

    //virtual ~Button(void){};
protected:
    //Our enumerated type
    const enum mouseStates {CLIP_MOUSEOUT, CLIP_MOUSEOVER, CLIP_MOUSEDOWN, CLIP_MOUSEUP};

    //Our rect to hold the offsets and size of the button
    SDL_Rect button;

    //Array of rects to hold the dimensions of each clip from the sprit sheet
    SDL_Rect clips[4];

    //Holds the location and size of the clip to show from sprite sheet
    SDL_Rect *clip;

    //The sprite sheet surface from which we clip the button images
    SDL_Surface *buttonSpriteSheet;

    //The surface for our button text
    SDL_Surface *buttonSurfaceText;

    //The text for our button
    string buttonText;

    //The state the button will lead to when clicked
    GameStates targetState;

    //Whether we are moused over the button
    bool mouseOver;
};

#endif

MenuButton.h(派生クラス)

#ifndef MENUBUTTON_H
#define MENUBUTTON_H

#include "button.h"

using namespace std;

class MenuButton :
    public Button
{
public:
    MenuButton(void);

    MenuButton(int x, int y, int w, int h, string text, GameStates state);

    void handleEvents();

    void render();

    ~MenuButton(void);
};

#endif

Title.h(ボタンを作成してエラーをスローしている状態)

#ifndef TITLE_H
#define TITLE_H

#include "GameState.h"
#include "SDL.h"
#include "SDL_image.h"
//#include "SDL_Mixer.h"
#include "Functions.h"
#include "Globals.h"
#include "Constants.h"
#include "MenuButton.h"
#include <iostream>
#include <string>

using namespace std;

class Title :
    public GameState
{
public:
    Title(void);

    //Handles intro events
    void handleEvents();

    //Handles intro logic
    void logic();

    //Handles intro rendering
    void render();

    ~Title(void);
private:
    SDL_Surface *background;
    MenuButton *testButton; //NOTE: This is the line throwing the errors
    //Mix_Music *music;
};

#endif

助けてくれてありがとう!〜<3

4

1 に答える 1

1

コンパイラは何であるかを知らないようMenuButtonです。これが当てはまる理由の1つはMENUBUTTON_H、別のヘッダーによっても定義されていることです。おそらく、Globals.h含まれているようなもの"title.h"、つまり、システムに依存関係ループがあります。クラスが周期的に依存していることを知っている場合は、周期を削除するのが最善です。それを行うには多くの方法があります。現在、循環依存が必要だと思っていても、それは良くなく、おそらく必要ではありません(JohnLakosによる「LargeScaleC ++ Design」という本には、依存サイクルを壊す方法に関する多くの情報が含まれています)。

サイクルがどこから来ているのかわからない場合は、コンパイラで-E(または/E)フラグを使用することをお勧めします。このオプションは通常、前処理された後に変換ユニットを生成します。これには、どのファイルが何らかの形式で入力されたかが示されます。前処理された出力がどのように見えるかはコンパイラーによって異なりますが、コンパイラーが何を認識できるかを確認でき、MenuButton宣言されていない理由を追跡できる可能性があります。

簡単な方法として、それMenuButtonが宣言されていることを確認することもできます。ポインターを形成するために、その定義は必要ありません。実際にポインタにアクセスするまでに、定義を確認しておけば十分です。宣言は次のようになります。

class MenuButton;

MenuButton..および。のポインタまたは参照メンバーを宣言するために使用して、各変換ユニットで繰り返すことができますMenuButton。宣言だけで、値を返す関数や値を渡す関数を宣言することもできますMenuButton。もちろん、実際に型を使用したい場合は、その定義を確認する必要があります。

于 2012-12-17T00:24:48.860 に答える