2011-06-22 18 views
12

मेरे समस्या:आगे घोषणा और नेमस्पेस (C++)

गॉट दो वर्गों, वर्ग ए और बी, तो मैं A.h और A.cpp और B.h और B.cpp मिला है। एक बी के लिए ज़रूरी है और बी ए मैं इसे नीचे दिए तरीक़े से हल के लिए ज़रूरी है (मैं नहीं जानता कि क्यों यह इतना हो गया है ...)

आह:

#include "B.h" 
class A{ ... 

ए सीपीपी:

#include "A.h" 

Bh:

#include "A.h" 
class A; // forward declaration 
class B { ... 

B.cpp:

#include "B.h" 

मैंने एक आगे की घोषणा का उपयोग किया और यह काम करता है।

समस्या यह है कि दोनों वर्गों को नामस्थान "ui" में होना चाहिए। या कम से कम मुझे लगता है कि यह अर्थ है:

A.h:

#include "B.h" 
namespace ui{ 
    class A; 
} 

class A{ ... 

B.h:

#include "A.h" 
namespace ui{ 
    class B; 
} 

class B{ ... 

यह अब और काम नहीं करता। नामस्थान और आगे की घोषणा के साथ इसे फिर से काम करने के लिए मुझे अब क्या करना है?

दोनों को इस नामस्थान में होना होगा। मैं क्यूटी के साथ काम कर रहा हूं और लाइनों "नेमस्पेस ui {" इत्यादि की आवश्यकता है। और दोनों वर्गों को एक दूसरे को जानने की जरूरत है। मैं पहले से ही करने की कोशिश की तो बस इस बनाने के लिए:

namespace ui{ 
class A; 
class B; 
} 
दोनों हेडर में

, लेकिन यह काम नहीं करता ...

Btw: सभी हैडर-फाइल्स भी "ifndef" -mechanism मिला है।

+3

"यह अब और काम नहीं करता है।" मतलब? कृपया सटीक कंपाइलर/लिंकर त्रुटियां पोस्ट करें। – fredoverflow

उत्तर

6
// A.h 
namespace ui { 
    class A; // forward 
    class B { 
    }; 
} 



// B.h 
namespace ui { 
    class B; // forward 
    class A { 
    }; 
} 



// A.cpp 
#include "A.h" 
#include "B.h" 



// B.cpp 
#include "A.h" 
#include "B.h" 
3

आप लगभग वहां हैं। यह काम करना चाहिए:

// A.h 
namespace ui { 

class B; 
class A { 
    ... 
}; 

} // namespace ui 

और

// B.h 
namespace ui { 

class A; 
class B { 
    ... 
}; 

} // namespace ui 

केवल एक चीज आप गलत आप नाम स्थान के अंदर वर्गों को परिभाषित करने के लिए है कि है, नामस्थान के अंदर उन्हें घोषित करने के लिए पर्याप्त नहीं है।

+0

मैं यह नहीं कर सकता। यह क्यूटी- डिजाइनर। यह सिर्फ यह करता है। मुझे नहीं पता कि क्यों। बीटीडब्ल्यू ने अपने पहले उदाहरण में भी काम किया है, मुझे दो आगे की घोषणाओं की आवश्यकता है। – Obs

+0

आपने देखा होगा कि आपको तीन जवाब मिलते हैं जो लगभग एक ही चीज़ कह रहे हैं? यह है इसे काम करने का एकमात्र तरीका। यदि क्यूटी-डिजाइनर को "नामस्थान यूई {' ... '} 'ब्लॉक के अंदर अपनी कक्षा परिभाषाओं को रखने के लिए राजी नहीं किया जा सकता है, तो आप उन वर्गों के साथ अटक गए हैं वैश्विक नामस्थान। – zwol

13

अगर मैं तुम्हें सही समझते हैं, आप इस तरह के एक निर्माण के साथ 2 अलग अलग प्रकार की घोषणा:

#include "B.h" 
namespace ui{ 
    class A; 
} 

class A{ ... }; 

यहाँ आप राज्य है कि वहाँ नाम स्थान ui में एक class A, लेकिन आप ग्लोबल नेम स्पेस में एक class A परिभाषित करते हैं। इसलिए ui::A घोषित किया गया है लेकिन कभी परिभाषित नहीं किया गया है।साथ ही ui नाम स्थान के लिए A की परिभाषा ले जाएँ:

#include "B.h" 
namespace ui{ 
    class A; 
} 

//somewhere later: 
namespace ui 
{ 
    class A{ ... }; 
} 
0

यह एक बहुत ही क्यूटी विशेष सवाल है।

जब क्यूटी डिजाइनर आपके लिए कोड फ़ाइल स्वत: उत्पन्न करता है, तो Ui नेमस्पेस आपके वर्गों से अलग नामस्थान है। वास्तव में यहां दो अलग-अलग वर्ग घोषित किए जा रहे हैं: class A वैश्विक नामस्थान में, और class Ui::AUi नामस्थान में। दूसरी कक्षा में उन सभी नियंत्रण होते हैं जो क्यूटी आपके लिए उत्पन्न करते हैं (जब आप फॉर्म डिज़ाइनर का उपयोग करते हैं), और प्रथम श्रेणी (वैश्विक नामस्थान में) में आपका सभी तर्क है। private: Ui::A* ui;, जो ui->setUp(this) साथ सेटअप है:

क्यूटी प्रजापति के संस्करण मैं उपयोग कर रहा हूँ (3.1) भी class A (नहीं Ui::A) के लिए एक निजी सदस्य उत्पन्न होगा। फिर आप नियंत्रणों तक पहुंच सकते हैं (उदाहरण के लिए ui->lineEdit->toPlainText();

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