5

मैं कुछ कोड लिख रहा हूं जहां मुझे एक क्लास वेरिएबल होना चाहिए जो एक स्थिर int सरणी है। मैं समझता हूँ कि मैं हेडर फाइल में कुछ इस तरह के साथ ऐसा कर सकते हैं, आह:स्थैतिक सरणी वर्ग चर "एकाधिक परिभाषा" सी ++

#ifndef A_H_ 
#define A_H_ 

class A 
{ 
public: 
    static const int a[]; 
}; 

const int A::a[] = {1,2}; 

#endif 

यह सिर्फ ठीक काम करता है अगर मैं तो, मुख्य केवल एक अन्य फ़ाइल में इस शीर्ष लेख, निम्नलिखित जैसा कुछ शामिल कर रहा हूँ। सीपीपी:

#include "A.h" 

#include <iostream> 
using namespace std; 

int main() 
{ 

    A myA; 
    cout << "0: " << myA.a[0] << endl; 
    cout << "1: " << myA.a[1] << endl; 
} 

लेकिन मैं अपने वर्ग एक की जरूरत है थोड़ा और अधिक जटिल होने के लिए लगता है, और मैं एक A.cpp रूप में अच्छी तरह दाखिल करना चाहते हैं। मैं अपने main.cpp फ़ाइल एक ही रखेंगे, लेकिन फिर आह को बदलने के रूप में निम्नानुसार (मैं सिर्फ एक समारोह, printA जोड़ दिया है):

#ifndef A_H_ 
#define A_H_ 

class A 
{ 
public: 
    void printA() const; 
    static const int a[]; 
}; 

const int A::a[] = {1,2}; 

#endif 

और फिर फ़ाइल A.cpp में:

#include "A.h" 

#include <iostream> 
using namespace std; 

void A::printA() const 
{ 

    cout << "Printing in A.cpp." << endl; 
    cout << "A.0: " << a[0] << endl; 
    cout << "A.1: " << a[1] << endl; 

} 

gcc -o Ao -c A.cpp के साथ एओ संकलन ठीक है। लेकिन main.cpp (gcc -o atest main.cpp एओ) संकलित करते समय इसे लिंक करना "ए :: ए" की एकाधिक परिभाषा के साथ विफल रहता है।

मैं समाधान के लिए इंटरनेट को खराब कर रहा हूं, और उन लोगों को मिला जिन्होंने अपने शीर्षकों में घोषित चर हैं जिन्हें "एकाधिक परिभाषा" त्रुटि मिलती है जब वे एकाधिक स्थानों में शीर्षलेख शामिल करते हैं, और समाधान घोषित करना प्रतीत होता है शीर्षलेख में परिवर्तनीय बाहरी, फिर इसे केवल एक स्रोत (गैर-शीर्षलेख) स्रोत फ़ाइल में परिभाषित करें। लेकिन मैं स्थिर और बाहरी दोनों वर्ग परिवर्तनीय घोषित नहीं कर सकता, क्या मैं कर सकता हूं? यदि मैं कोशिश करता हूं, या अगर मैं इसे बाहरी रूप से घोषित करता हूं, तो मुझे वैरिएबल के बारे में एक चेतावनी मिलती है जो स्थिर नहीं है (जब मैं दोनों कोशिश करता हूं तो "विरोधाभासी विनिर्देशक" त्रुटि भी होती है)।

तो, मेरा प्रश्न: क्या इस मामले में स्थिर सरणी वर्ग चर होना संभव है कि हेडर फ़ाइल को एक से अधिक स्रोत फ़ाइल में शामिल करने की आवश्यकता है? यदि हां, तो कैसे?

उत्तर

17

आप एक परिभाषा नियम का उल्लंघन कर रहे हैं। एक कार्यान्वयन फ़ाइल के अंदर परिभाषा ले जाएँ:

//A.cpp 
#include "A.h" 
const int A::a[] = {1,2}; 

समाधान आप extern साथ, के लिए reffering रहे हैं, गैर सदस्य चर पर लागू होता है। आपके मामले में a एक वर्ग सदस्य है।

7

आपको "const int a :: a [] = {1,2};" को हटा देना चाहिए हेडर फ़ाइल से लाइन। इस परिभाषा रेखा को आप में से एक .cpp फ़ाइलों में रखें। फिर आप हेडर फ़ाइल को कई बार शामिल कर सकते हैं जहां आपको इसकी आवश्यकता है।

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