मैं एक हेडर फाइल "USpecs.h" है।के एकाधिक परिभाषा "..." ग
लेकिन जब मैं इसे बनाने निम्न त्रुटि होती है:
Ucak.cpp | 6 | `UcakSpecs 'के कई परिभाषा |
जैसा कि मैंने पहले खोजा था, यह #ifndef के साथ ठीक होना चाहिए लेकिन यह नहीं है।
मैं एक हेडर फाइल "USpecs.h" है।के एकाधिक परिभाषा "..." ग
लेकिन जब मैं इसे बनाने निम्न त्रुटि होती है:
Ucak.cpp | 6 | `UcakSpecs 'के कई परिभाषा |
जैसा कि मैंने पहले खोजा था, यह #ifndef के साथ ठीक होना चाहिए लेकिन यह नहीं है।
इसमें गार्ड केवल एक ही अनुवाद इकाई के भीतर कई परिभाषाओं को रोकते हैं (यानी इसके शामिल हेडर के साथ एक एकल स्रोत फ़ाइल)। जब आप एकाधिक स्रोत फ़ाइलों से हेडर शामिल करते हैं तो वे कई परिभाषाओं को नहीं रोकते हैं।
extern std::vector<Specs*> UcakSpecs;
और एक (और केवल एक) स्रोत फ़ाइल में एक परिभाषा:
std::vector<Specs*> UcakSpecs;
यह काम करता है। धन्यवाद। – mucisk
समावेशन गार्ड केवल एक ही अनुवाद इकाई में एक से अधिक अनुवाद इकाई को शामिल करने से रोकते हैं। यदि आप इस शीर्षलेख को एकाधिक अनुवाद इकाइयों में शामिल करते हैं, तो आपके पास कार्यक्रम में UcakSpecs
की कई परिभाषाएं होंगी।
तरह से एक वैश्विक चर घोषित करने के लिए हेडर फाइल में extern
के रूप में यह घोषणा करने के लिए है:
#ifndef USPECS_H
#define USPECS_H
#inclde "Specs.h"
#include <iostream>
#include <vector>
extern std::vector<Specs*> UcakSpecs;
#endif
एक वैश्विक चर extern
के रूप में घोषित केवल एक घोषणा है।
फिर सुनिश्चित करें कि इसे केवल एक अनुवाद फ़ाइल में परिभाषित किया गया है जो इसे कार्यान्वयन फ़ाइल में परिभाषित कर रहा है (शायद USpecs.cpp
में);
std::vector<Specs*> UcakSpecs;
#ifndef
केवल एक संकलन इकाई पर लागू होता है। चूंकि आपके पास दो (मुख्य कार्य और Ucak
वर्ग) हैं, इसलिए चर को दो बार परिभाषित किया गया है।
हेडर फाइल में extern
के रूप में चर घोषित करने पर विचार करें:
extern std::vector<Specs*> UcakSpecs;
और Ucak.cpp
फाइल के अंदर यह परिभाषित करने:
std::vector<Specs*> UcakSpecs;
यह काम करना चाहिए।
कृपया दिखाने सीपीपी कोड फ़ाइल –
नहीं है एक
इसके बजाय, आप शीर्ष लेख में एक घोषणा करना चाहिए था पहले "शामिल" पर टाइपो। साथ ही, यदि यह 'Specs.h' नहीं है (क्योंकि आप इसे शामिल कर रहे हैं), यह क्या है? – slezica