2011-10-10 19 views
7

मेरे पास दो कक्षाएं, foo और bar हैं। foo में बार शामिल है और बार ऑब्जेक्ट्स के पॉइंटर्स का std :: वेक्टर शामिल है। रनटाइम के दौरान किसी बिंदु पर, बार को अन्य बार ऑब्जेक्ट्स के पॉइंटर्स के इस वेक्टर तक पहुंचना होता है। इसके लिए, foo में getBarObjects() नामक एक विधि है जो पॉइंटर्स की सरणी देता है।वर्ग प्रकार के वेक्टर के साथ आगे की घोषणा - अपूर्ण वर्ग प्रकार के सूचक को

इसके लिए, मैं बार में foo घोषित करने के लिए आगे बढ़ता हूं। मैं obvioulsy भी मैं जिस विधि का उपयोग कर रहा हूं उसे घोषित करना है - foo :: getBarObjects()। चूंकि यह पॉइंटर्स को बार में सरणी देता है, मैं एक दुष्चक्र में आता हूं।

मैं आगे शामिल नहीं कर सकता बार बार और फिर आगे बढ़ने में GetBarObjects() शामिल है, क्योंकि इसके परिणामस्वरूप "अपूर्ण प्रकार का नाम अनुमति नहीं है"।

foo.h:

#include "bar.h" 
#include <vector> 

class foo { 
    public: 
     foo(); 
     ~foo(); 
     std::vector<bar*> getBarObjects(); 
    private: 
     std::vector<bar*> barObjects; 
} 

bar.h:

class foo; 
std::vector<bar*> foo::getBarObjects();  // error, doesn't know bar at this point 

class bar { 
    public: 
     bar(foo *currentFoo); 
     ~bar(); 
     bool dosth(); 
    private: 
     foo *thisFoo; 
} 

bar.cpp:

#include "bar.h" 

bool bar(foo *currentFoo) { 
    thisFoo = currentFoo; 
} 

bool bar::dosth() { 
    thisFoo->getBarObjects();  // error, pointer to inomplete class type is not allowed 
} 

मैं बस दूसरी तरह के आसपास शामिल हैं, तो मैं होगा foo पार्श्व में बस एक ही समस्या है। कोई सुझाव?

उत्तर

15

आप सदस्यों को घोषित नहीं कर सकते हैं।

इसके बजाय, bar.cpp चाहिए #include दोनों foo.h और bar.h। समस्या सुलझ गयी।

सामान्य में, अगर आप अनुक्रम का उपयोग करें:

  • आगे सभी वर्ग प्रकार की घोषणा
  • सभी वर्ग प्रकार वर्ग के सदस्यों की
  • निकायों को परिभाषित करें

सब कुछ ठीक हो जाएगा।

+0

मेह, एक समस्या का सरल समाधान जो बड़ा लग रहा था। धन्यवाद! – Aerius

1

आप वेक्टर को foo.h में घोषित करने के लिए भूल गए हैं। आप getBarObjects से 0 -बाय-वैल्यू भी वापस कर सकते हैं जो संभवतः आप जो चाहते हैं वह नहीं है और सदस्य फ़ंक्शन की अगली घोषणा बेकार है।

इसके अलावा: हेडर गार्ड का उपयोग करें। कच्चे पॉइंटर्स पर आपकी स्थिति के लिए उपयुक्त स्मार्ट सूचक (std::shared_ptr, unique_ptr) पसंद करें। const नेस के लिए देखें।

+0

मैं हैडर गार्ड, कोई चिंता नहीं करते थे, मैं तो बस के रूप में मैं यह सब आपके द्वारा लिखे गए अतिरिक्त classnames और whatnot के साथ भ्रम से बचने के लिए उन्हें बाहर यहाँ हैं। धन्यवाद हालांकि – Aerius

4

आपको एक दूसरे से foo.h या bar.h शामिल करने की आवश्यकता नहीं है जब तक कि आप अन्य शीर्षलेख फ़ाइल से किसी भी वर्ग के आंतरिक भाग तक नहीं पहुंच जाते। शीर्षलेख फ़ाइलों में आवश्यक वर्गों की घोषणा करें, फिर अपनी स्रोत फ़ाइल से दोनों शीर्षलेख फ़ाइलें शामिल करें।

foo.h

#include <vector> 
class bar; 
class foo { 
    public: 
     foo(); 
     ~foo(); 
     std::vector<bar*> getBarObjects(); 
    private: 
     std::vector<bar*> barObjects; 
}; 

bar.h

class foo; 
class bar { 
    public: 
     bar(foo *currentFoo); 
     ~bar(); 
     bool dosth(); 
    private: 
     foo *thisFoo; 
} 

बार।सीपीपी

#include "foo.h" 
#include "bar.h" 

bool bar(foo *currentFoo) { 
    thisFoo = currentFoo; 
} 

bool bar::dosth() { 
    thisFoo->getBarObjects(); 
} 
संबंधित मुद्दे