2011-04-30 16 views
19

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

Shopable.h:

#ifndef _SHOPABLE_H_ 
#define _SHOPABLE_H_ 

#include "Library.h" 

class Shopable{ 
private: 
    std::string Name; 
    int Cost; 
    std::string Description; 
public: 
    std::string getName() const{return Name;} 
    int getCost() const {return Cost;} 
    virtual std::string getDesc() const = 0; 
}; 

#endif 

Weapon.h:

#ifndef _WEAPON_H_ 
#define _WEAPON_H_ 

#include "Globals.h" 
#include "Shopable.h" 

class Weapon : Shopable{ 
private: 
    int Damage; 
public: 
    Weapon(int Cost,int Damage,std::string Name) : Cost(Cost), Damage(Damage), Name(Name){} 
    std::string getDesc() const{ 
     return getName()+"\t"+tostring(Damage)+"\t"+tostring(Cost); 
    } 
    int Damage(Entity *target){ 
     int DamageDealt = 0; 
     //do damage algorithm things here 
     Special(); 
     return DamageDealt; 
    } 
}; 

#endif 

सही के साथ एक यादृच्छिक समारोह में कुछ लाइन में शामिल हैं:

std::map< std::string, Weapon* > weapons; 
Weapon* none = new Weapon(0,0,"None"); 
weapons[none->getName()] = none; 

त्रुटि getName साथ है () - "त्रुटि: फ़ंक्शन 'शॉप करने योग्य :: getName' पहुंच योग्य नहीं है"

उत्तर

56

आप चाहते हैं सार्वजनिक विरासत:

class Weapon : Shopable 

होना चाहिए:

class Weapon : public Shopable 

इसके अलावा, _SHOPABLE_H_ जैसे नाम उपयोगकर्ता लिखित सी ++ कोड में अवैध हैं, क्योंकि वे सी ++ कार्यान्वयन के लिए आरक्षित हैं। अग्रणी अंडरस्कोर को भूल जाएं और SHOPABLE_H का उपयोग करें।

और:

Weapon(int Cost,int Damage,std::string Name) 

होना चाहिए:

Weapon(int Cost,int Damage, const std::string & Name) 

स्ट्रिंग को कॉपी करने की अनावश्यक भूमि के ऊपर से बचने के लिए।

आप अपने नामकरण सम्मेलन पर पुनर्विचार करना चाहेंगे - आम तौर पर, सी ++ में फ़ंक्शन पैरामीटर नाम बाद के निचले मामले से शुरू होते हैं। अपरकेस अक्षरों से शुरू होने वाले नाम आम तौर पर उपयोगकर्ता द्वारा परिभाषित प्रकारों (यानी कक्षाएं, संरचना, enums इत्यादि) के लिए आरक्षित हैं

रुचि के मामले में, आप कौन सी सी ++ पाठ्यपुस्तक सीख रहे हैं?

+0

मैं पाठ्यपुस्तक का उपयोग नहीं कर रहा था, बस इंटरनेट पर स्थानों से बिट्स और टुकड़े उठा रहा था। – pighead10

11

विरासत सार्वजनिक होना चाहिए:

class Weapon : public Shopable 
8

आप निजी वंशानुक्रम का उपयोग कर रहे:

class Weapon : Shopable 

तो तथ्य यह है कि एक हथियार एक Shopable है अन्य वर्गों को दिखाई नहीं देता। इसे सार्वजनिक विरासत में बदलें:

class Weapon : public Shopable 
+0

निहित विरासत 'संरक्षित' नहीं है? –

+4

@ गुस्ताव: नहीं, यह 'संरचना' के लिए सार्वजनिक है, और 'कक्षा' के लिए निजी है। –

+0

@ माइक मुझे जांचना पड़ा क्योंकि मुझे उत्सुकता मिली, और आप बिल्कुल सही हैं। –

4

आपको कुछ और निर्दिष्ट नहीं करके निजी विरासत मिलता है। जनता के लिए, निजी वंशानुक्रम को यह बजाय

class Weapon : public Shopable{ 
5

class तों डिफ़ॉल्ट प्रयास करें struct रों। आप class का उपयोग कर रहे हैं, ताकि आप : public Base उपयोग करने के लिए यदि आप मॉडल बनाना चाहते हैं की जरूरत है "है-एक":

class Weapon : public Shopable{ // added "public"