8

このコードが機能しない理由がわかりません。すべてのソース ファイルがコンパイルされますが、それらをリンクしようとすると、コンパイラが未定義の参照エラーを表示します。コードは次のとおりです。

main.cpp:

#include "SDL/SDL.h"
#include "Initilize.cpp"

int main(int argc, char* args[]) 
{
    //Keeps the program looping
    bool quit = false;
    SDL_Event exit;
    //Initilizes, checks for errors
    if(Initilize::Start() == -1) 
    {
        SDL_Quit();
    }
    //main program loop
    while(quit == false) 
    {
        //checks for events
        while(SDL_PollEvent(&exit)) 
        {
            //checks for type of event;
            switch(exit.type) 
            {
                case SDL_QUIT:
                quit = true;
                break;
            }
        }
    }
    return 0;
}

初期化.h:

#ifndef INITILIZE_H
#define INITILIZE_H
#include "SDL/SDL.h"

/* Declares surface screen, its attributes, and Start(); */
class Initilize {
protected:
    static SDL_Surface* screen;
private:
    static int SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP;
public:
    static int Start();
};

#endif

初期化.cpp:

#include "Initilize.h"
#include "SDL/SDL.h"

/* Initilizes SDL subsystems, sets the screen, and checks for errors */
int Initilize::Start() 
{
    //screen attributes
    SCREEN_WIDTH = 640;
    SCREEN_HEIGHT = 480;
    //Bits per pixel
    SCREEN_BPP = 32;
    //Inits all subsystems, if there's an error, return 1   
    if(SDL_Init(SDL_INIT_EVERYTHING) == -1) {
            return 1;
    }
    //sets screen
    screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE);
    //Returns 1 if there was in error with setting the screen
    if(screen == NULL) {
            return 1;
    }
    SDL_WM_SetCaption("Game", NULL);
    return 0;
}

コードが奇妙にフォーマットされていた場合は申し訳ありません.4つのスペースを挿入してコードブロックに入れると、少し混乱します.

4

3 に答える 3

16

以下を cpp ファイルに追加します。

SDL_Surface* Initilize::screen = 0; // or nullptr
int Initilize::SCREEN_WIDTH = 640;
int Initilize::SCREEN_HEIGHT = 480;
int Initilize::SCREEN_BPP = 32;

また、これらの値が変わらない場合は、 にするとよいでしょうconst。上記を cpp ファイルに追加する必要がある理由は、静的メンバー変数をクラスの外部で定義する必要があるためです。static SDL_Surface* screen;など、クラス内は宣言であり、定義ではありません。staticメンバーは特別と見なされ、グローバル変数に非常に似ています。

これは、静的メンバーがクラスのすべてのインスタンス間で共有されるためです。これは、一度しか定義できないことを意味し、クラス内で定義を許可すると複数の定義が発生するため、C++ 標準では、クラスの外で定義する必要があります (また、定義を cpp ファイルに配置する必要があることも意味します)。

于 2012-08-24T23:41:09.033 に答える
2

Initialize.cpp_

#include "Initialize.h"
#include "SDL/SDL.h"

// this is the new line to insert
SDL_Surface* Initialize::screen = 0;
int Initialize::SCREEN_WIDTH=...; // whatever you want to set it to
int Initialize::SCREEN_HEIGHT=...; // whatever you want to set it to
int Initialize::SCREEN_BPP=...; // whatever you want to set it to

#include "Initialize.cpp"main.cppの行を削除します

代わりに

#include "Initialize.hpp"

gccを使用している場合は、

g++ -o <output-file> main.cpp Initialize.cpp <include flags like -I> <lib flags like -L>
于 2012-08-24T23:44:20.467 に答える
1

変数を初期化していないようです。Initialize start メソッドでそれらを割り当てていますが、初期化していません。int SCREENWIDTH;ヘッダーファイルだけでなく、ソースに割り当てる前に a を追加してみてください

于 2012-08-24T23:29:05.500 に答える