2012-03-20 15 views
9
#include <iostream> 
using std::cout; 
using std::endl; 

class square { 

public: 
    double length, width; 

    square(double length, double width); 
    square(); 

    ~square(); 

    double perimeter(); 
}; 

double square::perimeter() { 
return 2*square.length + 2*square.width; 
} 

int main() { 

square sq(4.0, 4.0); 

cout << sq.perimeter() << endl; 

return 0; 
} 

मैं एक साधारण कक्षा कार्यक्रम लिखने की कोशिश कर रहा हूं। मुझे त्रुटि'।' से पहले अपेक्षित प्राथमिक अभिव्यक्ति

सदस्य फ़ंक्शन 'डबल स्क्वायर :: परिधि()' में मिल रहा है; .cpp: 21: त्रुटि: '।' से पहले अपेक्षित प्राथमिक अभिव्यक्ति टोकन .cpp: 21: त्रुटि: '।' से पहले अपेक्षित प्राथमिक अभिव्यक्ति टोकन

क्या इसका मतलब है कि मुझे 2 * वर्ग :: लंबाई + 2 * वर्ग :: चौड़ाई का उपयोग करना है ??

+7

एक वर्ग के पास अलग-अलग 'लंबाई' और' चौड़ाई' क्यों होगी? आप बस 'साइड' का उपयोग कर सकते हैं। –

उत्तर

19

square एक प्रकार, नहीं एक वस्तु है;

return 2*square.length + 2*square.width; 

के बजाय कर

return 2*length + 2*width; 

(जो परोक्ष रूप में ही है:

return 2*this->length + 2*this->width; 

जो आप कर सकते हैं, या कृपया, स्पष्टता के लिए नहीं पसंद कर सकते हैं)।

2*square::length + 2*square::width मान्य सिंटैक्स अगर length और width

  • स्थिर कुछ नाम स्थान में square के सदस्यों, या कुछ आधार वर्ग square की
  • के सदस्यों, या
  • वस्तुओं थे होगा square
3

, बस का उपयोग

double square::perimeter() { 
    return 2 * length + 2 * width; 
} 
2

उदाहरण चर का उपयोग करने के लिए, बस उन्हें नाम:

double square::perimeter() { 
    return 2*length + 2*width; 
} 
3
double square::perimeter() { 
    return 2*square.length + 2*square.width; 
} 

आप square::perimeter() कहने के लिए है क्योंकि आप वर्ग वर्ग खुद की एक विधि को परिभाषित कर रहे जरूरत है। ऐसा लगता है कि आप इसे किसी विशिष्ट ऑब्जेक्ट पर परिभाषित करना चाहते हैं, लेकिन आप इसे वर्ग के सभी उदाहरणों के लिए उपलब्ध होना चाहते हैं, इसलिए आपको इसे किसी विशिष्ट पर परिभाषित करने की आवश्यकता है।

उदाहरण चर length और width दूसरे हाथ पर, एक वर्ग का एक विशिष्ट उदाहरण और नहीं पूरी क्लास में ही (अन्यथा आप उन्हें static के रूप में घोषित होगा) से संबंधित। इसका मतलब यह है कि आप कक्षा के माध्यम से जाने के बजाय उन्हें सीधे संदर्भित कर सकते हैं, और संकलक को पता चलेगा कि आप किस चर के बारे में बात कर रहे हैं। ऐसा इसलिए है क्योंकि width और length विधि के समान दायरे में परिभाषित किए गए हैं, इसलिए आपको यह जानने के लिए :: के साथ विशेष निर्देश देने की आवश्यकता नहीं है कि यह कहां मिल रहा है।इसलिए:

double square::perimeter() { 
    return 2 * length + 2 * width; //will refer to the instance variables automatically 
} 
4

हाँ, सही रूप होगा:

return 2*square::length + 2*square::width; 

square के बाद से एक प्रकार, नहीं एक वस्तु है।

इस संदर्भ में, यह रूप में एक ही है:,

return 2*this->square::length + 2*this->square::width; 

लेकिन जब से यह ही वस्तु और ही प्रकार है, तो आप सिर्फ लिख सकते हैं:

return 2*this->length + 2*this->width; 

या, सबसे सरल:

return 2*length + 2*width; 
2
double square::perimeter() { 
return 2*square.length + 2*square.width; 
} 

इस समारोह में square क्या है? वर्ग एक वर्ग है। आप वस्तुओं से सदस्यों को acces करने के लिए . ऑपरेटर का उपयोग करें। जैसे sq.somefun();

ताकि आप परिधि समारोह होना चाहिए:

double square::perimeter() { 
    return (2*(length + width)); 
    } 

लेकिन लंबाई और वर्ग बराबर की चौड़ाई नहीं है?

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