2013-05-06 7 views
6

का उपयोग करते समय फ़ंक्शन त्रुटि की एकाधिक परिभाषा, मैं एक साधारण UTIL.h फ़ाइल बना रहा हूं जिसमें मेरे C++ प्रोजेक्ट के लिए aplusb (int, int) फ़ंक्शन शामिल है। हालांकि मैं संकलित नहीं कर सकता और त्रुटि संदेश 'aplusb (int, int)' की एकाधिक परिभाषा के बारे में है। क्या आप कृपया मुझे त्रुटि को सही करने में मदद करें या मुझे कुछ संकेत दें?#if गार्ड क्लॉज

मैं अपने विवरण संदर्भ के लिए यहां अपनी परियोजना संलग्न करता हूं।

फ़ाइल UTIL.h

#ifndef UTIL_H_ 
#define UTIL_H_ 

int aplusb(int a, int b) { 
    return a + b; 
} 

#endif /* UTIL_H_ */ 

फ़ाइल ClassA.h

#ifndef CLASSA_H_ 
#define CLASSA_H_ 

class ClassA { 
public: 
    ClassA(); 
    virtual ~ClassA(); 
private: 
    int sum; 
}; 

#endif /* CLASSA_H_ */ 

फ़ाइल ClassA.cpp

#include "ClassA.h" 
#include "UTIL.h" 

ClassA::ClassA() { 
    // TODO Auto-generated constructor stub 
    sum = aplusb(3,5); 

} 

ClassA::~ClassA() { 
    // TODO Auto-generated destructor stub 
} 

फ़ाइल ClassB.h

#ifndef CLASSB_H_ 
#define CLASSB_H_ 

class ClassB { 
public: 
    ClassB(); 
    virtual ~ClassB(); 
private: 
    int sum; 
}; 

#endif /* CLASSB_H_ */ 

फ़ाइल ClassB.cpp

#include "ClassB.h" 
#include "UTIL.h" 

ClassB::ClassB() { 
    // TODO Auto-generated constructor stub 
    sum = aplusb(5,6); 
} 

ClassB::~ClassB() { 
    // TODO Auto-generated destructor stub 
} 

संकलित त्रुटि संदेश

ClassB.o: In function `aplusb(int, int)': 
/home/vtvan/Desktop/workspace/commonfunc/UTIL.h:11: multiple definition of `aplusb(int, int)' 
ClassA.o:/home/vtvan/Desktop/workspace/commonfunc/UTIL.h:11: first defined here 
collect2: error: ld returned 1 exit status 
make: *** [commonfunc] Error 1 

उत्तर

17

प्रथम संस्करण - inline विनिर्देशक का उपयोग

#ifndef UTIL_H_ 
#define UTIL_H_ 

inline int aplusb(int a, int b) { 
    return a + b; 
} 

#endif /* UTIL_H_ */ 

दूसरा संस्करण - .cpp फाइल में परिभाषा लिखें।

+0

मैं के रूप में उत्सुक हूँ दूसरा संस्करण "सही" क्यों होगा, और पहला नहीं। इस समारोह को रेखांकित करने की समस्या क्या होगी? – JBL

+0

@ जेबीएल वास्तव में कुछ भी नहीं, सही किया गया। – ForEveR

+0

धन्यवाद सब, मैं त्रुटि को दूर कर सकते हैं। – andycandy

0

हैडर फ़ाइलों का इरादा उन में वास्तविक कार्य करने का इरादा नहीं है (कुछ सी ++ पहलुओं जैसे टेम्पलेट्स नहीं हैं)। आपके मामले में सामान्य अभ्यास से आप अपने UTIL.H को फ़ंक्शन को प्रोटोटाइप करने के लिए बदल सकते हैं (int aplusb(int a, int b);) और इसके कार्यान्वयन को एक स्रोत फ़ाइल में ले जाना।

+0

यह हेडर फाइल में डाल करने के लिए काम करता है, जब तक आप उन्हें इनलाइन के रूप में चिह्नित बिल्कुल ठीक है। – Stewart

+0

मेरा कथन _ जितना टेम्पलेट्स नहीं है, उतना ही उन सभी मामलों के पूर्ण होने का इरादा नहीं था जहां हेडर फ़ाइलों में फ़ंक्शंस रखना ठीक है। – mah

+0

लेकिन यह होता है कि टेम्पलेट्स हाथ में इस मामले से कोई लेना देना नहीं है, जबकि वहाँ एक हेडर फाइल में इस समारोह को परिभाषित करने के लिए एक पूरी तरह से वैध तरीका है। – Gorpik

4

आपने अपनी फ़ाइल में फ़ंक्शन aplusb बनाया है। इसका अर्थ यह है कि प्रत्येक फ़ाइल के लिए आप इसे शामिल करते हैं, एक सार्वजनिक फ़ंक्शन एप्लसब बनाया जाएगा, जिसके परिणामस्वरूप एक नाम संघर्ष होगा।

यदि फ़ंक्शन इनलाइन होना चाहिए, तो उसे चिह्नित करें। यदि फ़ंक्शन एक टेम्पलेट होना चाहिए, तो उसे चिह्नित करें। यदि फ़ंक्शन को लिखा गया हो, तो इसे एक सीपीपी फ़ाइल में रखें और केवल प्रोटॉइप को एच फ़ाइल में रखें।

.h 
#ifndef UTIL_H_ 
#define UTIL_H_ 

int aplusb(int a, int b); 

#endif 

.cpp 
int aplusb(int a, int b) 
{ 
    return a+b; 
} 
2

आपको हेडर फ़ाइल में अपना एप्लसब फ़ंक्शन घोषित करना चाहिए, और एक सीपीपी फ़ाइल में परिभाषा प्रदान करना चाहिए। की तरह कुछ

util.h: फिर से परिभाषित करने के तुम क्या कर रहे समारोह है, जो वास्तव में है

#ifndef UTIL_H_ 
#define UTIL_H_ 

int aplusb(int, int); 

#endif /* UTIL_H_ */ 

त्रुटि संदेश आपको बता रहा है कि हर बार है कि आप util.h फ़ाइल में शामिल हैं, आप कर रहे हैं :-) यह ODR (एक परिभाषा-नियम) का उल्लंघन है, जिसमें कहा गया है कि परिभाषा (इस मामले में, इस मामले में) अद्वितीय होना चाहिए। अन्यथा संकलक विकल्पों के बीच चयन करने में असमर्थ होगा (भले ही, इस मामले में, वे बराबर हो)।

ध्यान दें कि टेम्पलेट्स इस मामले को थोड़ा जटिल करते हैं (संक्षेप में, क्योंकि टेम्पलेट अधिष्ठापन तक परिभाषा नहीं है)।

0

तुम भी एक util struct जहां हर समारोह स्थिर घोषित किया जाता है बना सकते हैं। इसके बाद आप Util::<function name>

फ़ाइल UTIL.h

#ifndef UTIL_H_ 
#define UTIL_H_ 

struct Util{ 
    static int aplusb(int a, int b) { 
     return a + b; 
    } 
}; 

#endif /* UTIL_H_ */ 

फ़ाइल ClassA.cpp

का उपयोग कर हर कार्य का उपयोग कर सकते
#include "ClassA.h" 
#include "UTIL.h" 

ClassA::ClassA() { 
    sum = Util::aplusb(3,5); 
} 

ClassA::~ClassA() { 
} 

फ़ाइल ClassB.cpp

#include "ClassB.h" 
#include "UTIL.h" 

ClassB::ClassB() { 
    sum = Util::aplusb(5,6); 
} 

ClassB::~ClassB() { 
} 
संबंधित मुद्दे