2012-08-24 23 views
7

के लिए अनिर्धारित संदर्भ मुझे नहीं पता कि यह कोड क्यों काम नहीं कर रहा है। सभी स्रोत फाइल संकलित करते हैं, लेकिन जब मैं उन्हें लिंक करने का प्रयास करता हूं तो संकलक मुझे अपरिभाषित संदर्भ त्रुटि के साथ चिल्लाता है।सी ++ स्थिर चर

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; 
} 

Initilize.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 

Initilize.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; 
} 

क्षमा करता है, तो कोड निराले ढंग से स्वरूपित किया गया था, डालने कोड यह कोड ब्लॉक में डालने के लिए चार रिक्त स्थान थोड़ा सा चीजें हैं।

+3

कृपया सही त्रुटि संदेश दें। – Chip

उत्तर

1

ऐसा प्रतीत होता है कि आपने कभी भी अपने वैयरबल्स को प्रारंभ नहीं किया है। आप उन्हें आरंभिक प्रारंभ विधि में असाइन कर रहे हैं लेकिन उन्हें प्रारंभ नहीं किया है। एक int SCREENWIDTH; में जोड़ने का प्रयास करें

+0

यह अपरिभाषित त्रुटि को ठीक करता है, लेकिन अब यह कहता है कि Initilize :: Start() ... – user1602079

+0

की कई परिभाषाएं हैं क्षमा करें, जब आप इसे प्रारंभ कर रहे हैं तो स्थिर कीवर्ड की आवश्यकता नहीं है, केवल 'int SCREENWIDTH' – user1593858

15

अपने cpp फ़ाइल में निम्न जोड़ें इससे पहले कि आप स्रोत में असाइन करें सिर्फ फ़ाइल शीर्षक नहीं:

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

इसके अलावा, अगर इन मूल्य कभी नहीं बदल, यह उन्हें बनाने के लिए अच्छा होगा const। आपके सीपीपी फ़ाइल में उपरोक्त जोड़ने की आवश्यकता है क्योंकि स्थैतिक सदस्य चर को कक्षा के बाहर परिभाषित करने की आवश्यकता है। static SDL_Surface* screen;, आदि आपकी कक्षा के अंदर केवल एक घोषणा है, और परिभाषा नहीं है। static सदस्यों को विशेष माना जाता है और यह वैश्विक चर के समान है।

इसका कारण यह है कि स्थिर वर्ग आपके वर्ग के सभी उदाहरणों के बीच साझा किए जाते हैं। इसका मतलब है कि उन्हें केवल को परिभाषित किया जा सकता है और कक्षा के अंदर परिभाषा को कई परिभाषाएं होने की अनुमति मिलती है, इसलिए सी ++ मानक आपको अपनी कक्षा के बाहर परिभाषित करने के लिए मजबूर करता है (और यह भी दर्शाता है कि आपको परिभाषा को cpp फ़ाइल में रखना चाहिए)।

+0

यह अपरिभाषित त्रुटि को हल करता है एक और कहता है कि योग्य नाम 'इनिटिलाइज ::' – user1602079

+0

@ user1602079: '# शामिल करें "Initilize.cpp" 'toclude" #itclude "Initilize.h" बदलें। –

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 

करते हैं और main.cpp में #include "Initialize.cpp" लाइन हटाने

बजाय

#include "Initialize.hpp" 

आप जीसीसी उपयोग कर रहे हैं, का उपयोग कर संकलन

g++ -o <output-file> main.cpp Initialize.cpp <include flags like -I> <lib flags like -L> 
+0

यह तय है! धन्यवाद! – user1602079

+0

@ user1602079 अगर इस उत्तर ने आपकी समस्या हल की है, तो कृपया उत्तर के बाईं ओर स्थित चेक मार्क पर क्लिक करें ताकि अन्य सही उत्तर देख सकें और प्रश्न अनुत्तरित सूची से बाहर निकलता है :) – WendiKidd