2011-11-27 19 views
15

मैं उस वर्ग की एक संपत्ति प्रारंभ करना चाहता हूं जिसमें किसी अन्य वर्ग का संदर्भ है जो इस तरह के संदर्भ को कन्स्ट्रक्टर के पैरामीटर के रूप में पास कर रहा हो। हालांकि मुझे एक त्रुटि प्राप्त होती है:कक्षा सदस्य प्रारंभिकरण के रूप में संदर्भ

"टैक्सक्वेयर :: बैंक 'को कन्स्ट्रक्टर बेस/सदस्य प्रारंभकर्ता सूची में प्रारंभ किया जाना चाहिए"। कक्षाओं के निम्नलिखित कोड में क्या गलत है?

#ifndef TAXSQUARE_H 
#define TAXSQUARE_H 
#include "Square.h" 

class Bank; 

class TaxSquare : public Square 
{ 
    public: 
     TaxSquare(int, int, Bank&); 
     virtual void process(); 

    private: 
     int taxAmount; 
     Bank& bank; 

}; 
#endif 
#include <iostream> 
#include "TaxSquare.h" 
#include "Player.h" 
#include "Bank.h" 
using namespace std; 

TaxSquare::TaxSquare(int anID, int amount, Bank& theBank) : Square(anID) 
{ 
    taxAmount = amount; 
    bank = theBank; 
} 
#ifndef BANK_H 
#define BANK_H 

class Bank 
{ 
public: 
    Bank(int, int, int); 
    void getMoney(int); 
    void giveMoney(int); 
    void grantHouse(); 
    void grantHotel(); 

private: 
    int sumMoney; 
    int numOfHouses; 
    int numOfHotels; 

}; 

#endif 

उत्तर

25

आप bank को आवंटित करने के लिए प्रयास कर रहे हैं, यह प्रारंभ नहीं:

TaxSquare::TaxSquare(int anID, int amount, Bank& theBank) : Square(anID) 
{ 
    // These are assignments 
    taxAmount = amount; 
    bank = theBank; 
} 

bank एक संदर्भ है, और इसलिए यह प्रारंभ किया जाना चाहिए। आप प्रारंभकर्ता सूची में डाल कर ऐसा करते हैं:

TaxSquare::TaxSquare(int anID, int amount, Bank& theBank) 
: Square(anID), taxAmount(amount), bank(theBank) 
{} 
4

त्रुटि आप एक गैर-आरंभिकृत संदर्भ के माध्यम से आवंटित करने के लिए कोशिश कर रहे हैं: एक सी ++ संदर्भ नहीं सौंपा जा सकता है - वस्तु इसे करने के लिए बजाय असाइन किया गया है संदर्भित करता है - और इतने , यदि यह सदस्य है, तो इसे प्रारंभकर्ता सूची में प्रारंभ किया जाना चाहिए (जैसे संकलक कहते हैं)।

4

“'TaxSquare::bank' must be initialized in constructor base/member initializer list”. What is wrong in the following code of the classes?

क्या गलत है कि TaxSquare::bank निर्माता आधार/सदस्य प्रारंभ सूची में प्रारंभ किया जा रहा है, वास्तव में के रूप में यह कहते है।

"कन्स्ट्रक्टर बेस/सदस्य प्रारंभिक सूची" प्रश्न में कन्स्ट्रक्टर के लिए प्रारंभिक सूची है, TaxSquare::TaxSquare(int, int, Bank&)। आप बेस (Square) प्रारंभ करने के लिए पहले ही इसका उपयोग कर रहे हैं। आपको bank सदस्य को प्रारंभ करने के लिए इसका उपयोग करना चाहिए, क्योंकि यह संदर्भ प्रकार का है। प्रारंभिक सूची में निर्दिष्ट चीजें डिफ़ॉल्ट-प्रारंभिक नहीं होती हैं, और संदर्भों के लिए कोई डिफ़ॉल्ट-प्रारंभिकता नहीं है, क्योंकि उन्हें हमेशा कुछ संदर्भ देना चाहिए, और संदर्भ के लिए उनके लिए कोई डिफ़ॉल्ट नहीं है।

ईमानदारी से, मुझे लगता है कि सी ++ में डेटा सदस्यों के संदर्भों का उपयोग करना 99% समय के मुकाबले ज्यादा परेशानी है। आप शायद एक स्मार्ट सूचक, या यहां तक ​​कि कच्चे एक के साथ बेहतर हो। लेकिन आप अभी भी आरंभ करना चाहते हैं कि आरंभिक सूची के साथ, भले ही आप बिना दूर हो सकें। वास्तव में taxAmount के लिए चला जाता है, वास्तव में।

// TaxSquare::TaxSquare(int anID, int amount, Bank& theBank) : Square(anID) 
// That thing after the colon is the initialization list:  ^^^^^^^^^^^^ 
// So add the other members to it, and then notice that there is nothing left 
// for the constructor body to do: 
TaxSquare::TaxSquare(int anID, int amount, Bank& theBank) : 
Square(anID), taxAmount(amount), bank(theBank) {} 
+0

+1 "प्रारंभिक सूची में निर्दिष्ट चीजों को डिफ़ॉल्ट-प्रारंभिक नहीं मिलता है, और संदर्भों के लिए कोई डिफ़ॉल्ट-प्रारंभिकता नहीं है, क्योंकि उन्हें हमेशा कुछ संदर्भ देना चाहिए " –

1

बैंक = बैंक; इस बयान का मतलब है आप obj1 बताए जाते हैं obj2 करने के लिए और यह असाइनमेंट ऑपरेटर जो गलत है फोन करेगा बैंक के रूप में प्रकार संदर्भ के रूप में नीचे

TaxSquare :: TaxSquare उल्लेख यह intialized किया जाना चाहिए (पूर्णांक anID, पूर्णांक राशि का है, बैंक & thebank): स्क्वायर (एआईडी), बैंक (बैंक) {}

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