-2

重複の可能性:
未定義の参照/未解決の外部シンボルエラーとは何ですか?それを修正するにはどうすればよいですか?

こんにちは私はクラスの初心者です、そして私はちょうどそれらを学び始めました。このエラーが発生する理由がわからないため、このコードについてサポートが必要です。

これが私のコードです

main.cpp

    #include "stdafx.h"
    #include "player.h"


SDL_Surface* screen = NULL;

void init()
{
    SDL_Init( SDL_INIT_VIDEO );

    //Set up screen
    screen = SDL_SetVideoMode( 640, 480, 32,  SDL_DOUBLEBUF |SDL_HWSURFACE |SDL_SWSURFACE);

    //SDL_BlitSurface( hello, NULL, screen, NULL );

        _putenv("SDL_VIDEO_CENTERED=1"); // Center the window 
    SDL_Init(SDL_INIT_VIDEO);
    SDL_WM_SetCaption("SDL Animation", "SDL Animation");
    //screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, 0, SDL_DOUBLEBUF |SDL_HWSURFACE |SDL_SWSURFACE);
    SDL_EnableKeyRepeat(0, 1600000);
    if(screen == NULL){
         printf("SDL_Init failed: %s\n", SDL_GetError());
    }


}

int _tmain(int argc, _TCHAR* argv[])
{   
    init();
    //SDL_Surface* sprite = SDL_BlitSurface(sprite,rcSprite, screen, &rcSprite);

    Player player;


    //Update Screen
    SDL_Flip( screen );

    SDL_FreeSurface(screen); 
    return 0;
}

player.h

    #ifndef PLAYER_H
#define PLAYER_H

#include "SDL.h"
#include "SDL_image.h"
#include "SDL_TTF.h"

class Player
{
public:
    Player (){
        HP = 20;
        playerScore = 0;
        playerSpeed = 10;
        playerJump = 20;
    }
    ~Player();
    int getScore() { return playerScore;}
    void setSpeed(int speed) { int playerSpeed = speed;}
    void setJump (int jump) {playerJump = jump;}
    void movePlayer(int x ,int y);
    void runRightAnim (SDL_Rect* clip);
    void runLeftAnim (SDL_Rect* clip);
    void drawPlayer(int x, int y, SDL_Surface* source, SDL_Surface* destination);
    static SDL_Rect sprite;
private:
    static int HP;
    static int playerScore;
    static int playerSpeed;
    static int playerJump;
    static int animRate;

};

#endif

そして最後の1人のplayer.cpp

    #include "stdafx.h"

#include "SDL.h"
#include "SDL_image.h"
#include "SDL_TTF.h"

#include "player.h"

void Player::runRightAnim(SDL_Rect* clip)
{

}

void Player::runLeftAnim(SDL_Rect* clip)
{

}

void Player::drawPlayer(int x, int y, SDL_Surface* source, SDL_Surface* destination)
{
     SDL_Rect dst;
          dst.x = x;
          dst.y = y;
     SDL_BlitSurface(source,NULL,destination,&dst);
     //SDL_BlitSurface(selectionCanvas, NULL, canvas, selectionRect);
}

エラーは

1>main.obj : error LNK2019: unresolved external symbol "public: __thiscall Player::~Player(void)" (??1Player@@QAE@XZ) referenced in function _wmain
1>main.obj : error LNK2001: unresolved external symbol "private: static int Player::playerJump" (?playerJump@Player@@0HA)
1>main.obj : error LNK2001: unresolved external symbol "private: static int Player::playerSpeed" (?playerSpeed@Player@@0HA)
1>main.obj : error LNK2001: unresolved external symbol "private: static int Player::playerScore" (?playerScore@Player@@0HA)
1>main.obj : error LNK2001: unresolved external symbol "private: static int Player::HP" (?HP@Player@@0HA)

コードは明らかに完成していませんが、このエラーを取り除きたいだけです

4

1 に答える 1

1

「未解決の外部」エラーは、関数を宣言して使用しようとしたときに発生しますが、実装していません。特に:

1> main.obj:エラーLNK2019:未解決の外部シンボル "public:__thiscall Player ::〜Player(void)"(?? 1Player @@ QAE @ XZ)関数_wmainで参照

あなたはの宣言を持っているのにPlayer::~Player()

class Player
{
public:
  /* ... */
    ~Player();

このメソッドは実装されません。

問題のメソッドを実装して、このエラーを修正してください。

編集:さらに、クラスには、宣言されているが定義されていない静的メンバー変数があります。あなたの宣言はここにあります:

class Player
{
/* ...  */
private:
    static int HP;
    static int playerScore;
    static int playerSpeed;
    static int playerJump;
    static int animRate;

};

しかし、この宣言は変数を定義していません。これらの統計を定義して初期化する必要があります。そうしないと、ここでも未解決の外部が取得されます(取得されます)。

通常、cppファイルのどこかにあります。

int Player::playerScore = 0;

余談ですが、static複数回インスタンス化できるように見えるクラスのメンバー変数を使用しています。これを行う場合:

Player a;
Player b;

複数のPlayerオブジェクトをインスタンス化するには、メンバー変数が宣言されているため、staticそれぞれが同じものを「共有」しますplayerScore。これは、コードを見るとあまり意味がありません。あなたはおそらくこれらをstaticsにしたくないでしょう。

于 2012-10-31T14:47:42.187 に答える