2012-07-02 14 views
12

से पहले अपेक्षित वर्ग-नाम मैं सी ++ सीखने की कोशिश कर रहा हूं और विरासत को समझने की कोशिश करते समय मैंने एक त्रुटि पर ठोकर खाई है।बहुत बुनियादी विरासत: त्रुटि: '{' टोकन

संकलन: daughter.cpp फ़ाइल में /home/jonas/kodning/testing/daughter.cpp:1 से शामिल हैं: /home/jonas/kodning/testing/daughter.h:6: त्रुटि: उम्मीद वर्ग पहले नाम '{' टोकन प्रक्रिया स्थिति 1 (0 मिनट, 0 सेकंड) 1 त्रुटियों, 0 चेतावनी

मेरे फाइलों के साथ समाप्त: main.cpp:

#include "mother.h" 
#include "daughter.h" 
#include <iostream> 
using namespace std; 

int main() 
{ 
    cout << "Hello world!" << endl; 
    mother mom; 
    mom.saywhat(); 
    return 0; 
} 

mother.cpp:

#include "mother.h" 
#include "daughter.h" 

#include <iostream> 

using namespace std; 


mother::mother() 
{ 
    //ctor 
} 


void mother::saywhat() { 

    cout << "WHAAAAAAT" << endl; 


} 

mother.h:

#ifndef MOTHER_H 
#define MOTHER_H 


class mother 
{ 
    public: 
     mother(); 
     void saywhat(); 
    protected: 
    private: 
}; 

#endif // MOTHER_H 

daughter.h:

#ifndef DAUGHTER_H 
#define DAUGHTER_H 


class daughter: public mother 
{ 
    public: 
     daughter(); 
    protected: 
    private: 
}; 

#endif // DAUGHTER_H 

और daughter.cpp:

#include "daughter.h" 
#include "mother.h" 

#include <iostream> 

using namespace std; 


daughter::daughter() 
{ 
    //ctor 
} 

मुझे क्या करना चाहते हैं बेटी सब कुछ वारिस बताने के लिए है मां वर्ग से सार्वजनिक (= saywhat())। मैं क्या गलत कर रहा हूं?

+0

इसके अलावा आपको 'mother.h' या 'mother.cpp' में' daughter.h' शामिल करने की आवश्यकता नहीं है। आपने लगभग विरासत को खींचा है, सुझावों का सुझाव दिया है और आपको जाने के लिए अच्छा होना चाहिए। – nikhil

+0

ए सी ++ सम्मेलन टिप, जैसा कि आप कहते हैं कि आप केवल सीख रहे हैं - कक्षा के नामों का पहला अक्षर आम तौर पर पूंजीकृत होता है। यह एक आवश्यकता नहीं है, लेकिन आप पाएंगे कि यह एक सतत कोडिंग सम्मेलन है। साथ ही, मैंने देखा है कि आपने नीचे कुछ उत्तरों पर सकारात्मक टिप्पणियां छोड़ी हैं - कृपया उस उत्तर को स्वीकार करें जिसने आपको सबसे अधिक मदद की है! प्रत्येक उत्तर के बगल में एक चेकमार्क होना चाहिए, इसे क्लिक करने पर इसे स्वीकार किया जाएगा। StackOverflow में योगदान के लिए धन्यवाद! – WendiKidd

उत्तर

18

आप mother.h यहां शामिल करना भूल:

#ifndef DAUGHTER_H 
#define DAUGHTER_H 

#include "mother.h" //<--- this line is added by me.  

class daughter: public mother 
{ 
    public: 
     daughter(); 
    protected: 
    private: 
}; 

#endif // DAUGHTER_H 

आप क्योंकि daughtermother से ली गई है, इस शीर्ष लेख शामिल करने की जरूरत है। इसलिए संकलक को mother की परिभाषा को जानने की आवश्यकता है।

5

सबसे पहले, आपने कार्यान्वयन फ़ाइलों में गार्ड शामिल किए हैं। उन्हें हटा दो।

दूसरा, यदि आप किसी वर्ग से प्राप्त होते हैं, तो आपको उस शीर्षलेख को शामिल करने की आवश्यकता होती है जहां कक्षा परिभाषित की जाती है।

+0

वास्तव में गार्ड केवल '.h' फ़ाइल में हैं। मुझे लगता है, उसके पास एक टाइपो है: पहली 'बेटी सीपीपी' वास्तव में 'बेटी.h' होना चाहिए। – Nawaz

+1

@ नवाज हाँ, मुझे लगता है कि आप सही हैं। मैंने अभी सीपीपी देखा और गार्ड शामिल हैं :) –

5

बेटी.cpp में, शामिल की दो पंक्तियों को स्विच करें। अर्थात

#include "mother.h" 
#include "daughter.h" 

क्या हुआ कि संकलक वर्ग daughter की परिभाषा को देख रही है और आधार वर्ग mother की परिभाषा नहीं मिल सकता था। तो यह आपको बता रहा है कि { "मैं के सामने पहचानकर्ता mother उम्मीद कर रहा हूँ" "लाइन

class daughter: public mother { 

में एक वर्ग के होने के लिए, लेकिन मैं इसे परिभाषा है नहीं मिल सकता है!"

mother.cpp में, daughter.h को शामिल करने को हटा दें। कंपाइलर को daughter.h की परिभाषा जानने की आवश्यकता नहीं है; i.e. वर्ग mother का उपयोग daughter के बिना किया जा सकता है। daughter.h को शामिल करने से कक्षा परिभाषाओं के बीच अनावश्यक निर्भरता प्रस्तुत की गई है।

दूसरी तरफ, कक्षा (.cpp) की परिभाषा में हेडर को शामिल रखने के लिए हमेशा बेहतर IMHO होता है और कक्षा (.h) की घोषणा नहीं होती है।इस तरह हेडर शामिल करने के दौरान आपको हेडर समावेशन दुःस्वप्न को हल करने की आवश्यकता कम होती है, जिसमें बदले में अन्य शीर्षलेख शामिल होते हैं जिन पर आपके पास नियंत्रण नहीं होता है। लेकिन कई उत्पादन कोड में हेडर में हेडर शामिल है। दोनों सही हैं, जब आप ऐसा करते हैं तो सावधान रहना चाहिए।

+0

समझ गया। आपका बहुत धन्यवाद। तुम सब अद्भुत हो! – Jonas

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