2010-09-19 21 views
10

क्षमा याचना:मुझे क्लास त्रुटि का यह पुनर्वितरण क्यों मिल रहा है? कोड डंप के लिए

gameObject.cpp:

#include "gameObject.h" 
class gameObject 
{ 
    private: 
    int x; 
    int y; 
    public: 
    gameObject() 
    { 
    x = 0; 
    y = 0; 
    } 

    gameObject(int inx, int iny) 
    { 
     x = inx; 
     y = iny; 
    } 

    ~gameObject() 
    { 
    // 
    } 
    int add() 
    { 
     return x+y; 
    } 
}; 

gameObject.h:

class gameObject 
{ 
    private: 
    int x; 
    int y; 
    public: 
    gameObject(); 

    gameObject(int inx, int iny); 
    ~gameObject(); 
    int add(); 
}; 

त्रुटियाँ:

||=== terrac, Debug ===| 
C:\terrac\gameObject.cpp|4|error: redefinition of `class gameObject'| 
C:\terrac\gameObject.h|3|error: previous definition of `class gameObject'| 
||=== Build finished: 2 errors, 0 warnings ===| 

मैं समझ नहीं क्या गलत। मदद?

उत्तर

31

आप हेडर फ़ाइल में कक्षा को परिभाषित कर रहे हैं, हेडर फ़ाइल को * .cpp फ़ाइल में शामिल करें और कक्षा को दूसरी बार परिभाषित करें क्योंकि पहली परिभाषा हेडर फ़ाइल द्वारा अनुवाद इकाई में खींची गई है। लेकिन प्रति अनुवाद इकाई की केवल एक गेम ऑब्जेक्ट क्लास परिभाषा की अनुमति है।

आप वास्तव में सिर्फ कार्यों को लागू करने वर्ग को दूसरी बार परिभाषित करने की जरूरत नहीं है। इस तरह कार्यों को लागू:

#include "gameObject.h" 

gameObject::gameObject(int inx, int iny) 
{ 
    x = inx; 
    y = iny; 
} 

int gameObject::add() 
{ 
    return x+y; 
} 

आदि

+1

Ahhhh, धन्यवाद! – Dataflashsabot

7

cpp फ़ाइल में कार्यान्वयन रूप

gameObject::gameObject() 
    { 
    x = 0; 
    y = 0; 
    } 
gameObject::gameObject(int inx, int iny) 
    { 
     x = inx; 
     y = iny; 
    } 

gameObject::~gameObject() 
    { 
    // 
    } 
int gameObject::add() 
    { 
     return x+y; 
    } 
नहीं एक वर्ग gameObject { } परिभाषा ब्लॉक

भीतर

में होना चाहिए

+1

इस फिक्स के अलावा, रचनाकारों को * चरक-प्रारंभकर्ता-सूची * का उपयोग करना चाहिए और सदस्य चर को प्रारंभ करने के लिए कन्स्ट्रक्टर का शरीर नहीं होना चाहिए। –

+0

पूरी तरह से सहमत हैं (हालांकि प्रश्न से संबंधित नहीं है) (+ 1 मुझसे) – frag

0

आप class gameObject को अपने 0 में परिभाषित करते हैंफ़ाइल और आपकी .h फ़ाइल।
यह एक पुनर्वितरण त्रुटि बना रहा है।

आप एक जगह में, वर्ग को परिभाषित करना चाहिए एक बार,। (सम्मेलन का कहना है परिभाषा .h में है, और सभी कार्यान्वयन .cpp में है)

कृपया हमें बेहतर ढंग से समझने में मदद, त्रुटि संदेश के कौन से भाग आप मुसीबत के साथ है?

त्रुटि के पहले भाग का कहना वर्ग gameObject.cpp
में नए सिरे से परिभाषित किया गया है त्रुटि के दूसरे भाग का कहना है पिछले वर्णन से gameObject.h में है।

संदेश कितना साफ हो सकता है?

+1

यह आपको स्पष्ट हो सकता है, लेकिन संभवतः यह नए लोगों को स्पष्ट नहीं है –

2

आप एक ही कक्षा में दो बार तय कर रहे हैं क्यों है।

अपने इरादे सीपीपी फ़ाइल में तरीकों को लागू करना है तो कुछ इस तरह ऐसा:

gameObject::gameObject() 
{ 
    x = 0; 
    y = 0; 
} 
gameObject::~gameObject() 
{ 
    // 
} 
int gameObject::add() 
{ 
     return x+y; 
} 
0

पूर्वप्रक्रमक #endif कुछ #ifndef नाम #define नाम है कि आपकी समस्या का समाधान करना चाहिए शामिल करें। समस्या यह हैडर से फ़ंक्शन पर फिर हेडर पर जा रही है, इसलिए यह सभी प्रीप्रोसेसर (# शामिल) कई बार कक्षा को फिर से परिभाषित कर रहा है।

1

हेडर फाइल

#pragma once 
+0

यह क्या हासिल होगा? –

0

में जोड़ने के तुम इतनी तरह .h फ़ाइल लपेट चाहिए:

#ifndef Included_NameModel_H 

#define Included_NameModel_H 

// Existing code goes here 

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