2009-03-11 33 views
5

में क्लास ऑब्जेक्ट्स घोषित करना हर किसी को नमस्कार।हेडर फ़ाइल

मुझे लगता है कि मैं एक मौलिक पर छेड़छाड़ कर रहा हूं लेकिन मुझे समाधान कहीं भी नहीं मिला। कोई भी, आगे बढ़ेगा और समझाएगा।

मेरे पास एक प्रोग्राम है जिसमें तीन फाइलें हैं; main.ccp, add.h, add.cpp।

मैं add.h में वर्ग 'एसए' घोषित करने और अपनी सभी कार्यों add.cpp

additional.h

class SA { 
    ... 
public 
    int x; 
} Obj1, Obj2; 

main.ccp

#include "additional.h" 

int main() { 

    Obj1.x = 5; 

    ... 
} 

इस में परिभाषित किया गया मुझे संकलन पर एक लिंक त्रुटि देता है: त्रुटि LNK2005: "कक्षा SA Obj1" (? Obj1 @@ 3VSA @@ ए) पहले से ही main.obj

में परिभाषित है

ऑब्जेक्ट का एकमात्र विघटन add.h में होता है, और कहीं और नहीं। कार्यक्रम ठीक संकलित करता है, तो मुख्य और नहीं शीर्षक में वस्तुओं की घोषणा:

main.ccp

मुद्दा है कि मैं primarially add.cpp के भीतर वस्तुओं का प्रयोग करना होगा चाहते हैं, लेकिन अभी भी main.cpp के माध्यम से कई सार्वजनिक मूल्यों को शुरू करने के लिए। ज्ञान के किसी भी शब्द?

उत्तर

11

obj1 और obj2 घोषित अपने सीपीपी के बजाय पर ज

add.h

class SA { 
... 
public 
    int x; 
}; 

main.cpp

#include "additional.h" 

SA Obj1, Obj2; 

int main() { 

Obj1.x = 5; 

... 
} 

यदि आप Obj1 और Obj घोषित करना चाहते हैं अपने ज फ़ाइल में 2, तो जैसे ज फ़ाइल में निर्वासन जोड़ें:

extern SA Obj1, Obj2; 

लेकिन आप अपनी परियोजना में एक .cpp फ़ाइल में वस्तुओं की घोषणा करना चाहिए:

main.cpp

SA Obj1, Obj2; 

इसका कारण यह है कि हर बार जब आप .h फ़ाइल शामिल करते हैं, तो आप Obj1 और Obj2 की घोषणा कर रहे हैं। तो यदि आप दो बार .h फ़ाइल शामिल करते हैं, तो आप Obj1 और Obj2 के दो उदाहरण बनाएंगे। कीवर्ड बाहरी जोड़कर, आप संकलक को बता रहे हैं कि आपने पहले से ही अपने प्रोजेक्ट में दो चर को घटा दिया है (अधिमानतः, एक .cpp फ़ाइल में)।

+0

सही। धन्यवाद! – Raugnar

6

बाहरी कीवर्ड का उपयोग करें। इन सार्वजनिक वस्तुओं को हेडर में बाहरी के रूप में घोषित करें, फिर सीपीपीएस में से किसी एक में उदाहरण परिभाषित करें।

इस तरह

:

extern SA Obj1; // in header 

SA Obj1;// in any one (no more than one) cpp 
4

आप भी अपने हेडर फाइल में निम्न कोड पंक्ति हो सकता है:

static SA Obj1, Obj2; 

यह रन टाइम पर प्रत्येक वस्तु का केवल 1 उदाहरण बना सकते हैं और redefinitions कर पाएगा। हालांकि, ध्यान रखें कि .h फ़ाइल शामिल करने वाली सभी फ़ाइलें उन दो ऑब्जेक्ट्स के समान उदाहरण का उपयोग कर रही हैं, इसलिए जब आप उन्हें एक्सेस कर रहे हों तो आपको सावधान रहना होगा।

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