2010-08-31 17 views
12

में एक प्रकार का नाम नहीं है, मैंने अभी सी ++ में प्रोग्रामिंग शुरू की है, और मैंने 2 कक्षाएं बनाने की कोशिश की है जहां एक दूसरे को शामिल करेगा।कक्षा का नाम C++

फ़ाइल A.h:

#ifndef _A_h 
#define _A_h 

class A{ 
    public: 
     A(int id); 
    private: 
     int _id; 
     B _b; // HERE I GET A COMPILATION ERROR: B does not name a type 
}; 

#endif 

फ़ाइल A.cpp:

#include "A.h" 
#include "B.h" 
#include <cstdio> 

A::A(int id): _id(id), _b(){ 
    printf("hello\n the id is: %d\n", _id); 
} 

फ़ाइल B.h:

#ifndef _B_h 
#define _B_h 

class B{ 
    public: 
     B(); 
}; 
#endif 

फ़ाइल B.cpp:

#include "B.h" 
#include <cstdio> 

B::B(){ 
    printf("this is hello from B\n"); 
} 

मैं पहली बार बी वर्ग एक वर्ग संकलन और उसके बाद, लेकिन फिर मैं त्रुटि संदेश मिलता है:

A.h:9: error: ‘B’ does not name a type

मैं इस समस्या को कैसे ठीक करूं?

+0

@Georg आपने सब कुछ एक कोड सेगमेंट में क्यों रखा? वे अलग फाइलें हैं। –

+0

@ एमीर: मैंने * संपादन * पर क्लिक करने से पहले इसे तोड़ दिया और मैं अनुपस्थित था :) –

+0

आप जवाब के अलावा टिक मार्क पर क्लिक करके सबसे अधिक उपयोगी पाए गए उत्तरों में से एक को स्वीकार कर सकते हैं। यह उन लोगों के लिए सहायक होगा जो समान समस्याएं करेंगे। – Naveen

उत्तर

25

प्रीप्रोसेसर A.h और B.h फ़ाइलों की सामग्री को सम्मिलित करता है जहां include कथन होता है (यह वास्तव में केवल कॉपी/पेस्ट है)। जब संकलक A.cpp पर विश्लेषण करता है, तो उसे कक्षा B के बारे में पता होने से पहले कक्षा A की घोषणा मिलती है। यह आपको दिखाई देने वाली त्रुटि का कारण बनता है।

  1. A.h में B.h शामिल करें: इस को हल करने के दो तरीके हैं। आमतौर पर उन फ़ाइलों में हेडर फ़ाइलों को शामिल करना एक अच्छा विचार है जहां उनकी आवश्यकता होती है। यदि आप अप्रत्यक्ष समावेशन पर भरोसा करते हैं, हालांकि एक अन्य शीर्षलेख, या संकलन इकाई (सीपीपी-फाइल) में शामिल एक विशेष आदेश, यह केवल आपको और दूसरों को भ्रमित करेगा क्योंकि परियोजना बड़ी हो जाती है।
  2. आप वर्ग A में टाइप B के सदस्य चर का उपयोग करते हैं, तो संकलक B का सही और पूर्ण घोषणा को पता है, क्योंकि यह A के लिए स्मृति-लेआउट बनाने के लिए की जरूरत है की जरूरत है। यदि, दूसरी तरफ, आप B के सूचक या संदर्भ का उपयोग कर रहे थे, तो आगे की घोषणा पर्याप्त होगी, क्योंकि संकलक को संदर्भक के लिए आरक्षित करने की आवश्यकता होती है या संदर्भ कक्षा परिभाषा से स्वतंत्र होता है। यह इस तरह दिखेगा:

    class B; // forward declaration   
    class A { 
    public: 
        A(int id); 
    private: 
        int _id; 
        B & _b; 
    }; 
    

    हेडर के बीच परिपत्र निर्भरताओं से बचने के लिए यह बहुत उपयोगी है।

मुझे उम्मीद है कि इससे मदद मिलती है।

2

"एएच" में "बीएच" शामिल करें। यह 'ए' संकलित करते समय संकलक के लिए 'बी' की घोषणा में लाता है।

ओपी के मामले में पहली गोली है।

$ 3.4.1/7 -

"A name used in the definition of a class X outside of a member function body or nested class definition27) shall be declared in one of the following ways:

before its use in class X or be a member of a base class of X (10.2), or

— if X is a nested class of class Y (9.7), before the definition of X in Y, or shall be a member of a base class of Y (this lookup applies in turn to Y’s enclosing classes, starting with the innermost enclosing class),28) or

— if X is a local class (9.8) or is a nested class of a local class, before the definition of class X in a block enclosing the definition of class X, or

— if X is a member of namespace N, or is a nested class of a class that is a member of N, or is a local class or a nested class within a local class of a function that is a member of N, before the definition of class X in namespace N or in one of N’s enclosing namespaces."

3

आप पहली बार A.h से B.h शामिल करना चाहिए। B b; जब तक आप B.h शामिल नहीं करते हैं तब तक कोई समझ नहीं आता है।

2

समस्या यह है कि आपको B.h को अपने A.h फ़ाइल में शामिल करने की आवश्यकता है। समस्या यह है कि A की परिभाषा में, संकलक अभी भी नहीं जानता कि B क्या है। आपको अपने द्वारा उपयोग किए जा रहे सभी प्रकार की सभी परिभाषाओं को शामिल करना चाहिए।

1

जब आप कक्षा एक परिभाषित करते हैं, आह में, आप स्पष्ट रूप कहते हैं कि वर्ग एक सदस्य बी है कि

आप "Bh" "आह" में अवश्य शामिल करें आप # लापता

1

नहीं कर रहे हैं आह में "भ" शामिल हैं?

2
error 'Class' does not name a type 

बस में मामला कोई एक ही मूर्खतापूर्ण बात मैंने किया है ... मैं खरोंच से एक छोटे से परीक्षण कार्यक्रम बनाने रहा था और मैं कक्षा बजाय वर्ग (एक छोटे से सी के साथ) टाइप किया है। मैंने त्रुटि संदेश में उद्धरणों का कोई नोटिस नहीं लिया और मेरी समस्या को समझने में बहुत लंबा समय बिताया।

एक समाधान के लिए मेरी खोज ने मुझे यहां लाया ताकि मुझे लगता है कि यह किसी और के साथ भी हो सकता है।

संबंधित मुद्दे