2008-11-21 16 views
7

मैं घोषणा और एक वर्ग के एक के अंदर एक वर्ग बी का उपयोग करें और ए
मैं एक तथ्य के लिए पता है बाहर बी को परिभाषित कि यह संभव है क्योंकि Bjarne Stroustrup
में इस का उपयोग करता है करने के लिए कोशिश कर रहा हूँ उनकी पुस्तक "द सी ++ प्रोग्रामिंग भाषा"
(पृष्ठ 2 9 3, उदाहरण के लिए स्ट्रिंग और एसईपी कक्षाएं)।सी ++ नेस्टेड कक्षाएं आगे घोषणा त्रुटि

tst.cpp: In constructor ‘A::A()’: 
tst.cpp:5: error: invalid use of undefined type ‘struct A::B’ 
tst.cpp:3: error: forward declaration of ‘struct A::B’ 

मैं सी ++ Faq और closeset को देखने के लिए करने की कोशिश की:

तो इस कोड के अपने न्यूनतम टुकड़ा है कि समस्याओं

class A{ 
struct B; // forward declaration 
B* c; 
A() { c->i; } 
}; 

struct A::B { 
/* 
* we define struct B like this becuase it 
* was first declared in the namespace A 
*/ 
int i; 
}; 

int main() { 
} 

इस कोड जी ++ में निम्नलिखित संकलन त्रुटियों देता है का कारण बनता है मुझे here और here मिला लेकिन
वे मेरी स्थिति पर लागू नहीं होते हैं।
मैं यहां से read this भी हूं लेकिन यह मेरी समस्या को हल नहीं कर रहा है। इस

उत्तर

11

struct बी

+0

हाँ की परिभाषा के बाद 'इनलाइन' कीवर्ड का उपयोग करके इनलाइन के रूप में फ़ंक्शन को परिभाषित करें, जो काम करता है धन्यवाद :) – xxxxxxx

+0

आपका स्वागत है! :-) –

+1

बी घोषित होने के बाद निर्माता को परिभाषित किया गया है। बी परिभाषित होने के बाद इसे परिभाषित करने की आवश्यकता है। –

15

अभिव्यक्ति c->i पर

दोनों जीसीसी और MSVC 2005 दे संकलक त्रुटियों dereferences struct A::B सूचक तो एक पूर्ण परिभाषा कार्यक्रम में इस बिंदु पर दिखाई देना चाहिए।

सबसे आसान फिक्स A गैर-इनलाइन के निर्माता को बनाने और struct A::B के निर्धारण के बाद इसके लिए एक शरीर प्रदान करना है।

+0

या, संरचना बी – Phlucious

7

यही कारण है कि आप परिभाषाओं घोषणाओं से अलग रखना चाहते हैं का एक अच्छा उदाहरण है की परिभाषा के बाद एक के लिए निर्माता को परिभाषित करें। आपको चीजों के क्रम को बदलने की जरूरत है ताकि निर्माता A::A() को struct A::B की परिभाषा के बाद परिभाषित किया गया हो।

class A 
{ 
    struct B; 
    B* c; 
    A(); 
}; 

struct A::B 
{ 
    int i; 
}; 

A::A() { c->i; } 

int main() 
{ 
    return 0; 
}
1

दिलचस्प है, मैं पृष्ठ 293 ('11 .12 एक स्ट्रिंग क्लास ') Stroustrup पुस्तक में उल्लेख किया साथ ही समस्या से टकरा गए हैं।

उदाहरण छपी हुई पुस्तक में प्रदान की गलती होने के लिए, इनलाइन के रूप में निम्न विधियों में उपलब्ध कराने के बजाय struct एसआरईपी

class String { 
    // ... 
    void check(int i) const { if (i<0 || rep->sz <=i) throw Range(); } 
    char read(int i) const { return rep->s[i]; } 
    void write(int i, char c) { rep=rep->get_own_copy(); rep->s[i]=c; } 
    ...etc... 

मैं थोड़ा googled की परिभाषा के बाद उन्हें परिभाषित करने लगता है, और पाया लेखक का इस स्ट्रिंग क्लास का नवीनतम कार्यान्वयन, यहां उपलब्ध है: http://www2.research.att.com/~bs/string_example.c

ऐसा लगता है कि उन्होंने इसे संशोधित किया है ताकि इन विधियों में इस समस्या में उल्लिखित समस्या से बचने के लिए इनलाइन नहीं हैं।

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