2009-08-15 19 views
13

एक परियोजना में शामिल मैं 2 वर्गों है:परिपत्र सी ++ हैडर

// mainw.h

#include "IFr.h" 
... 
class mainw 
{ 
public: 
static IFr ifr; 
static CSize=100; 
... 
}; 

// IFr.h

#include "mainw.h" 
... 
class IFr 
{ 
public float[mainw::CSize]; 
}; 

लेकिन मैं इस कोड संकलन नहीं कर सकते, static IFr ifr; लाइन पर एक त्रुटि प्राप्त हो रही है। क्या इस प्रकार का पार-समावेश प्रतिबंधित है?

+1

मुझे लगता है कि मुख्य होना चाहिए :: CSize –

उत्तर

15

पार के इस प्रकार है समावेश शामिल हैं?

हां।

एक काम के आसपास कहना है कि mainw की आईएफआर सदस्य, एक संदर्भ या एक सूचक है, ताकि एक आगे की घोषणा की तरह, पूर्ण घोषणा सहित के बजाय क्या करेंगे होगा:

//#include "IFr.h" //not this 
class IFr; //this instead 
... 
class mainw 
{ 
public: 
static IFr* ifr; //pointer; don't forget to initialize this in mainw.cpp! 
static CSize=100; 
... 
} 

वैकल्पिक रूप से , एक अलग शीर्षलेख फ़ाइल में CSize मान को परिभाषित करें (ताकि ifr.h में mainw.h को शामिल करने के बजाय यह अन्य शीर्षलेख फ़ाइल शामिल हो।)।

0

आप मिल गया तो

#ifndef __MYHEADER_NAME_WHICH_IS_RANDOM_PER_FILE_H 
#define __MYHEADER_NAME_WHICH_IS_RANDOM_PER_FILE_H 
//... Code.. 
#endif 

अपने कोड के चारों ओर लिपटा, :)

[संपादित करें] कोड वर्तनी तो आप ठीक होना चाहिए: ओ: पी

+0

इससे इस मामले में सहायता नहीं होगी। – ChrisW

+0

यह वास्तव में इस मामले में मदद नहीं करेगा - यह स्पष्ट होना चाहिए कि मुख्य श्रेणी वर्ग को –

+0

संकलित करने से पहले आईफ़्रू कक्षा की पूर्ण घोषणा को स्पष्ट रूप से देखना होगा, आप दोनों सही हैं। मान लीजिए कि मैं ट्रिगर पर थोड़ा तेज़ था :) – cwap

4

आपके पास एक दूसरे को एम्बेड करने वाले दो वर्ग नहीं हो सकते हैं। आप उनमें से एक एक सूचक बना सकता है:

class foo; 

class bar 
{ 
    foo* fooPtr; 
} 

आप foo का निर्माण और नाशक में बार के निर्माता में fooPtr के लिए असाइन करें और यह मुफ़्त करना होगा - यह निश्चित रूप से थोड़ा अधिक काम है।

या, इस मामले में, टिप्पणीकर्ताओं में से एक के रूप में सुझाव दिया गया है, mainw :: आकार को परिभाषित करें और इसे कहीं भी आम रखें।

1

आप इस तरह के पुनरावर्ती शामिल कर सकते हैं, लेकिन आम तौर पर आपको किसी प्रकार की हेडर गार्ड चाल का उपयोग करने की भी आवश्यकता होगी - अन्यथा प्रीप्रोसेसर एक अनंत रिकर्सन में जाएगा। यह वास्तव में, अपने मूल समस्या को हल करने में मदद नहीं करेगा क्योंकि आप अनिवार्य रूप से, जिनमें से प्रत्येक परस्पर क्रम में अन्य से भरा घोषणा को देखने के लिए आवश्यकता होती है दो वर्गों, संकलित करने के लिए है:

class mainw 
{ 
public: 
static IFr ifr; // needs to see the full declaration of the Ifr class in order to know the size 
... 

class IFr 
{ 
public float[mainw::size]; // needs to see the full declaration of mainw in order to know what size is 

चाहे कोई भी डाल सबसे पहले, यह संकलित करने में असमर्थ होगा क्योंकि इसे दूसरे के पूर्ण विवरण जानने की आवश्यकता है।

+0

और क्योंकि प्रत्येक वर्ग द्वारा अन्य वर्ग के पूर्ण विवरण की आवश्यकता है, एक [आगे की घोषणा] (http://stackoverflow.com/q/553682/1497596) मदद नहीं करता है। हालांकि, यदि फ़ाइल 'ए' कहने के लिए फ़ाइल शामिल है, तो कक्षा 'बी' के लिए केवल पॉइंटर्स या संदर्भ शामिल हैं, फिर कक्षा 'ए' के भीतर कक्षा' बी 'के लिए आगे की घोषणा संकलन संभव बना सकती है। – DavidRR

1

परिपत्र शामिल किए जाने के इस तरह का सी ++ द्वारा अनुमति नहीं है, लेकिन यह काम करना चाहिए:

इसके बजाय IFr.h सहित, एक आगे घोषणा का उपयोग करें।

class IFr; 
class mainw 
{ 
    //... 
}; 

यह mainw संकलन ठीक कर देगा, लेकिन सभी कोड ifr सदस्य का उपयोग करता है IFr.h भी शामिल करने के लिए की जरूरत है।

यह केवल इसलिए काम करता है क्योंकि ifrstatic सदस्य है। अन्यथा, कंपाइलर को ifr के सटीक आकार को जानने की आवश्यकता होगी।

इसके अलावा, जैसा कि कई अन्य लोगों ने कहा है, आपको दोनों शीर्षकों के चारों ओर गार्ड को शामिल करना चाहिए ताकि एक ही शीर्षलेख को दो बार शामिल किया जा सके।

#ifndef IFR_H 
#define IFR_H 
//... 
#endif 
1

आप कर सकते हैं:

// mainw.h 

#include "IFr.h" 
class mainw { 
public: 
    static const size_t CSize=100; 
    static IFr<CSize> ifr; 
... 
}; 

// IFr.h 
template <size_t Sz> 
struct IFr { 
    float sz_[Sz]; 
}; 

या मामले में CSize कार्यावधि में बदलने के लिए @ChrisW जवाब से पता चलता है के रूप में एक सूचक समाधान का उपयोग की जरूरत है।

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