2012-06-27 20 views
17

की अपूर्ण प्रकार/अग्रेषित घोषणा का अमान्य उपयोग मेरी समस्या बहुत आम है, मुझे पता है लेकिन मैं खोज रहा हूं और हर समाधान की कोशिश कर रहा हूं और अभी भी काम नहीं कर रहा हूं। तो किसी भी मदद की सराहना की जाएगी! =)त्रुटि -

अग्रिम धन्यवाद!

g++ -ISFML/include -Iclasses/ -W -Wall -Werror -c -o classes/Object.o classes/Object.cpp 
In file included from classes/Core.hh:18:0, 
     from classes/Object.hh:4, 
     from classes/Object.cpp:1: 
classes/MapLink.hh:9:1: error: invalid use of incomplete type ‘struct Object’ 
classes/MapLink.hh:6:7: error: forward declaration of ‘struct Object’ 
In file included from classes/Core.hh:19:0, 
     from classes/Object.hh:4, 
     from classes/Object.cpp:1: 
classes/Player.hh:9:1: error: invalid use of incomplete type ‘struct Object’ 
classes/MapLink.hh:6:7: error: forward declaration of ‘struct Object’ 
make: *** [classes/Object.o] Error 1 

तो बुनियादी तौर पर, मुझे मिल गया है एक मुख्य युक्त (main.cpp)

#include "Core.hh" 

int  main(void) 
{ 
    ... 
} 

यहाँ हैडर मेरे सभी शामिल हैं (कोर युक्त फ़ाइल है:

मैं संकलन पर यह त्रुटि है .hh)

#ifndef __CORE_HH__ 
# define __CORE_HH__ 

#include ... 
#include "Object.hh" 
#include "MapLink.hh" 
#include "Player.hh" 

class Core 
{ 
    ... 
}; 

#endif /* __CORE_HH__ */ 

और फिर फ़ाइलों को उत्पन्न कर रहे हैं मुझे मुसीबतों (Object.hh)

#ifndef __OBJECT_HH__ 
# define __OBJECT_HH__ 

#include "Core.hh" 

class Object 
{ 
    ... 
}; 

#endif /* __OBJECT_HH__ */ 

(MapLink.hh)

#ifndef __MAPLINK_H__ 
# define __MAPLINK_H__ 

#include "Core.hh" 

class Object; 

class MapLink : public Object 
{ 
    ... 
}; 

#endif /* __MAPLINK_H__ */ 

(Player.hh)

#ifndef __PLAYER_H__ 
# define __PLAYER_H__ 

#include "Core.hh" 

class Object; 

class Player : public Object 
{ 
    ... 
}; 

#endif /* __PLAYER_H__ */ 
+2

हेडर गार्ड के लिए आपको [आरक्षित नाम] (http://stackoverflow.com/questions/228783) का उपयोग नहीं करना चाहिए; यह http://stackoverflow.com/questions/3345159 –

+1

जैसी समस्याओं का कारण बन सकता है यहां आपके शीर्षक में एक ही त्रुटि के साथ मेरी अपनी स्थिति का समाधान है, लेकिन शायद आपके लिए नहीं: मुझे शिकायत के तहत उस वर्ग का शीर्षलेख शामिल करना था मेरे सीपीपी में, अगर कक्षा की सार्वजनिक विधि को किसी अन्य वर्ग द्वारा संदर्भित किया गया था। मेरे पास बहुत जटिल निर्भरताएं थीं और आगे की घोषणाओं के मिश्रित उपयोग भी शामिल थे। मैं इसे समाधान के मुकाबले यहां एक नोट के रूप में लिख रहा हूं क्योंकि आपके पास पहले से ही एक था। – kakyo

उत्तर

11

समस्या # 1:
आप केवल एक पूरी तरह से घोषित कक्षा से, अन्यथा प्राप्त करना होगा संकलक नहीं जानता कि क्या करना है।
आगे की घोषणा class Object; हटाएं।

समस्या # 2:

  • में "Core.hh" आप "Object.hh", "MapLink.hh" और "Player.hh:
    आप एक सर्कुलर निर्भरता सब कुछ खत्म हो "।
  • "ऑब्जेक्ट.hh", "MapLink.hh" और "Player.hh" में आप "Core.hh" शामिल करते हैं।

आपको यह सुनिश्चित करने की ज़रूरत है कि प्रत्येक वर्ग में उस कक्षा को पूरी तरह से शामिल किया जाए जो इसे प्राप्त करता है।
मुझे यकीन नहीं है कि कक्षाएं एक दूसरे के साथ कैसे बातचीत करती हैं, आपको प्रश्न में उस विवरण को प्रदान करना चाहिए।

  • संशोधित "MapLink.hh" और "PlayerLink.hh" इतना है कि वे "Object.hh" में शामिल हैं, नहीं "Core.hh"
  • :
    मेरा अनुमान है कि आप इस प्रकार अपने समावेशन संशोधित करने की आवश्यकता है
  • "ऑब्जेक्ट.hh" संशोधित करें ताकि इसमें "Core.hh" शामिल न हो।
+0

Core.hh/Object.hh – Azuli42

+0

में एक-दूसरे का कोई संदर्भ नहीं है, मैं सभी एसएफएमएल को शामिल करना चाहता था लेकिन आप सही हैं, संपूर्ण कोर सहित। सही विचार है! कोशिश कर रहा है कि – Azuli42

+1

यह बहुत बेहतर है! बहुत बहुत धन्यवाद मिस्टर ईटन: डी – Azuli42

1

कंपाइलर को विरासत के लिए कक्षा के पूर्ण इंटरफ़ेस को जानना चाहिए। इस मामले में, कंपाइलर आपकी वस्तु नहीं देख सका।यह अन्य फ़ाइलों

+0

आपके उत्तर के लिए धन्यवाद! क्षमा करें, मैं यह उल्लेख करना भूल गया कि "Object.hh" पहले से ही Player.cpp और MapLink.cpp में शामिल है और अभी भी वह त्रुटि प्राप्त हो रही है! – Azuli42

0

में object.hh फ़ाइल शामिल करने के लिए का पालन करें शामिल आवश्यक है: - __OBJECT_H__ परिभाषित किया गया है

  • Core.hh - __CORE_H__
  • MapLink.hh परिभाषित किया गया है -

    1. Object.hh शामिल Core.hh, लेकिन उस फ़ाइल की सामग्री चरण 2 और #ifndef के कारण शामिल नहीं है।
    2. Player.hh - कदम के रूप में एक ही 3.

    तो MapLink.hh और Player.hh इससे पहले कि आप से विरासत करने की कोशिश Object की परिभाषा को देखने के लिए नहीं मिलता है, और आप कर सकते हैं एक वर्ग से नहीं इनहेरिट कि पूरी तरह से परिभाषित नहीं किया गया है।

    ठीक करने के लिए: विशेष रूप से उस वर्ग के शीर्षलेख को शामिल करें जिसे आप प्राप्त कर रहे हैं।
    वह है, #include "Object.hh" से MapLink.hh और Player.hh जोड़ें।

  • +0

    मदद के लिए धन्यवाद! यह वही त्रुटि देता है .. मुझे समझ में नहीं आता कि यह कितना आसान है कि मुझे इतना परेशानी दे रही है! – Azuli42