2013-08-17 11 views
10
#include <iostream> 

class Core; 
class State; 

int main(){ 
     std::cin.get(); 
     return 0; 
} 

class State{ 
public: 
    State(Core* core){ 
     core->setState(); 
    } 
}; 

class Core{ 
public: 
    Core(){ 
     State state(this); 
    } 
    void setState(){ 
     std::cout << "setting state" << std::endl; 
    } 
}; 

का उपयोग मैं "अपरिभाषित प्रकार का उपयोग" त्रुटि प्राप्त करता रहता हूं। मैंने सोचा कि अगर मैं दोनों कक्षाओं को घोषित करता हूं, तो यह समस्या को ठीक करेगा लेकिन मैं इसे समझ नहीं सकता। क्या यह सिर्फ मूर्खतापूर्ण सी ++ वाक्यविन्यास है जिसे मैं याद कर रहा हूं?अपरिभाषित प्रकार

संपादित करें: गैमेस्टेट टाइपो के बारे में खेद है, मैंने इसे राज्य में बदल दिया है और यह अभी भी त्रुटि उत्पन्न करता है।

+0

आपके पास 'क्लास गेमस्टेट है;' लेकिन वास्तव में वह वर्ग कहां परिभाषित है? – lurker

उत्तर

17

State::State में, आप वास्तव में परिभाषित होने से पहले Core का उपयोग कर रहे हैं। आप अपने उदाहरण में आसानी से इसे ठीक कर सकते हैं:

class State{ 
public: 
    State(Core* core); 
}; 

class Core{ 
    // This stays the same... 
}; 

State::State(Core* core) 
{ 
    core->setState(); 
} 

यह एक अलग कार्यान्वयन में इन कार्यों के कार्यान्वयन के लिए और अधिक व्यवहार में आम है (.cpp) फ़ाइलें, जिस स्थिति में आगे घोषणाओं के रूप में आपने काम करेगा अपेक्षित होना।

उस मामले में:

// State.h 
class Core 

class State{ 
public: 
    State(Core* core); 
}; 

और

// Core.h 
#include "State.h" 

class Core{ 
public: 
    Core(){ 
     State state(this); 
    } 

    void setState(){ 
     std::cout << "setting state" << std::endl; 
    } 
}; 

और कार्यान्वयन फ़ाइल:

// State.cpp 
#include "State.h" 
#include "Core.h" 

State::State(Core* core) 
{ 
    core->setState(); 
} 
+0

नहीं, यह प्रकार घोषित करता है, यह इसे परिभाषित नहीं करता है। – Chad

+0

बहुत बहुत धन्यवाद, मैं कभी अपने आप को प्राप्त नहीं होता। – Ben

4

आप एक प्रकार की घोषणा अग्रेषित कर सकते हैं जब आप केवल नाम की जरूरत है, जैसे, पॉइंटर्स, संदर्भ, फ़ंक्शन मान तर्क, या वापसी प्रकार बनाने के लिए। यदि आप इसका काफी उपयोग करते हैं, उदाहरण के लिए, फ़ंक्शन परिभाषा में या पॉइंटर को डिफरेंस करके, आपको परिभाषा की आवश्यकता होती है। इस समस्या से निपटने का तरीका सदस्य कार्य को घोषित करना है, लेकिन इसे State की कक्षा परिभाषा में परिभाषित नहीं करना है। इसके बजाय, Core की परिभाषा को एक बार परिभाषित करने के बाद आप इसे परिभाषित करेंगे:

State::State(Core* core){ 
    core->setState(); 
} 
संबंधित मुद्दे