2014-04-23 8 views
6

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

mpg:cylinders:displacement:horsepower:weight:acceleration:modelYear:origin:carName 

उदाहरण के लिए :

10.0:8:360.0:215.0:4615.:14.0:70:1:ford f250 
10.0:8:307.0:200.0:4376.:15.0:70:1:chevy c20 
11.0:8:318.0:210.0:4382.:13.5:70:1:dodge d200 

वर्ग है:

#include <string> 
#include <vector> 
#include <iostream> 

using namespace std; 

class AutoData { 

public: 
    AutoData() 
    { 
     mpg = 0; 
     cylinders = 0; 
     displacement = 0; 
     horsepower = 0; 
     weight = 0; 
     acceleration = 0; 
     modelYear = 0; 
     origin = 0; 
     carName = ""; 
    } 

    AutoData(const AutoData & rhs) 
    { 
     setAuto(rhs.mpg, rhs.cylinders, rhs.displacement, rhs.horsepower, rhs.weight, rhs.acceleration, rhs.modelYear, rhs.origin, rhs.carName); 
    } 

    void setAuto(float mp, int cy, float di, float ho, float we, float ac, int mo, int o, string ca) 
    { 
     mpg = mp; 
     cylinders = cy; 
     displacement = di; 
     horsepower = ho; 
     weight = we; 
     acceleration = ac; 
     modelYear = mo; 
     origin = o; 
     carName = ca; 
    } 

    const float & getmpg() const 
    { 
     return mpg; 
    } 

    const int & getcylinders() const 
    { 
     return cylinders; 
    } 

    const float & getdisplacement() const 
    { 
     return displacement; 
    } 

    const float & gethorsepower() const 
    { 
     return horsepower; 
    } 

    const float & getweight() const 
    { 
     return weight; 
    } 

    const float & getacceleration() const 
    { 
     return acceleration; 
    } 

    const int & getmodelYear() const 
    { 
     return modelYear; 
    } 

    const int & getorigin() const 
    { 
     return origin; 
    } 

    const string & getcarName() const 
    { 
     return carName; 
    } 

    bool operator == (const AutoData & rhs) const 
    { 
     if(getmpg() == rhs.getmpg()) 
     { 
      return gethorsepower() == rhs.gethorsepower(); 
     } 

     else 
     { 
      return false; 
     } 
    } 

    bool operator > (const AutoData & rhs) const 
    { 
     if(rhs.getmpg() > getmpg()) 
     { 
      return true; 
     } 

     else if(getmpg() == rhs.getmpg()) 
     { 
      if(rhs.gethorsepower() > gethorsepower()) 
      { 
       return true; 
      } 
     } 

     else 
     { 
      return false; 
     } 
    } 


private: 
    float mpg; 
    int cylinders; 
    float displacement; 
    float horsepower; 
    float weight; 
    float acceleration; 
    int modelYear; 
    int origin; 
    string carName; 
}; 

कोई मदद/सलाह किसी को भी प्रदान कर सकते हैं बहुत सराहना की जाएगी !! धन्यवाद

+0

अगर आप सिर्फ अदालत सांत्वना देने << एमपीजी << प्रिंट करना चाहते हैं ":" << सिलेंडरों << "" यदि आप स्ट्रिंग में स्टोर करना चाहते हैं तो स्ट्रिंगस्ट्रीम का उपयोग करें। – Mike

+0

लेकिन मैं इनके पूरे वेक्टर को कैसे मुद्रित करूं? ताकि mpg1: cylinders1: आदि ... mpg2: cylinders2: आदि ... –

+0

बस वेक्टर पर फिर से सक्रिय करें और प्रविष्टियों के बीच नई लाइनें जोड़ें – stefaanv

उत्तर

7

मैं तुम्हें std::cout << AutoData(); ऐसा करने में सक्षम होना चाहता हूँ, तुम उत्पादन धारा ऑपरेटर operator<< ओवरलोड की जरूरत है:

std::ostream& operator<< (std::ostream &out, AutoData const& data) { 
    out << data.getmpg() << ':'; 
    out << data.getcylinders() << ':'; 
    // and so on... 
    return out; 
} 

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

तो फिर तुम कर सकते हैं:

AutoData myAuto; 
std::cout << myAuto << '\n'; 
+1

मुझे 'कॉन्स्ट एंड' नोटेशन बहुत भ्रमित लगता है (इस तथ्य से परेशान है कि अंतर्निहित 'ऑटोडाटा'' संदर्भ है, संदर्भ नहीं है), लेकिन इसके अलावा, ऐसा लगता है कि हमने वही उत्तर टाइप करना शुरू कर दिया है समय: डी लेकिन मैं धीमा था, क्योंकि मैंने 'ऑपरेटर >>' भी करने की कोशिश की ... आह, और मैं 'ऑपरेटर <<' में 'std :: endl' डालेंगे, इसलिए मैं गारंटी दे सकता हूं कि मैं' 'ऑपरेटर >>' में 'std :: readline' के साथ carName' ... – Massa

+3

@ मासा मैं 'विपक्ष' का उपयोग करने के लिए उपयोग किया जाता हूं, लेकिन हो सकता है कि आप शुरुआत के लिए सही हो, यह भ्रमित हो सकता है।'Std :: endl' के बारे में, मुझे लगता है कि यह 'ऑपरेटर <<' में नहीं होना चाहिए, क्योंकि आप कोमा/टैब से अलग, एक ही पंक्ति पर एकाधिक 'ऑटोडाटा' रखना चाहते हैं। यह उस चीज़ पर निर्भर करता है जिसकी आपको वास्तव में आवश्यकता है। – Holt

+0

मेरा तर्क यह है कि यदि आप 'ऑटोडाटा :: कारनाम' के लिए (डिफ़ॉल्ट?) टर्मिनेटर परिभाषित नहीं करते हैं और इसे 'ऑपरेटर <<' पर लागू करते हैं, तो 'ऑपरेटर >>' यह नहीं पता कि रिकॉर्ड कहां समाप्त होता है। यही कारण है कि मैं 'एंडल' के साथ रिकॉर्ड को समाप्त करने और अंतिम स्ट्रिंग को पढ़ने के लिए 'रीडलाइन' का उपयोग करने के सरल विकल्प के लिए बस गया होगा। अन्य विकल्प टर्मिनेटर को 'ऑटोडाटा' के 'स्थिर' सदस्य में रखना होगा और इसका उपयोग करके पढ़ना और लिखना लिखना होगा .... – Massa

3

क्या आप अब तक की कोशिश की? मेरे दृष्टिकोण operator<< ओवरलोडिंग किया जाएगा, जैसे:

std::ostream& operator<<(std::ostream& out, const AutoData& dasAuto) { 
    return out << dasAuto.getmpg() << ':' << dasAuto.getcylinders() << 
    /* insert everthing in the desired order here */ 
    std::endl; 
} 

और 'समझ' समारोह के लिए एक ही बात है, जैसे:

std::istream& operator>>(std::istream& in, AutoData& dasAuto) { 
    float mpg; 
    int cylinders; 
    float displacement; 
    float horsepower; 
    float weight; 
    float acceleration; 
    int modelYear; 
    int origin; 
    string carName; 
    char separator; 
    const char SEP = ':'; 

    if(!(in >> mpg >> separator) || (separator != SEP)) return in; 
    if(!(in >> cylinders >> separator) || (separator != SEP)) return in; 
    /* rinse, repeat */ 
    if(!std::getline(in, carName)) return in; 
    dasAuto.setAuto(mpg, cylinders /*, etc etc */); 
    return in; 
} 
+2

सावधान रहें, 'ऑटो' सी ++ में आरक्षित कीवर्ड है 11. – Holt

+0

@ होल्ट - यह मेरे दिमाग फिसल गया ... यह 06:30 है, मैं शायद आधा सो रहा था: डी – Massa

0

आप इस लेख पढ़ सकते हैं के बारे में friend और operator << पता करने के लिए, http://www.cprogramming.com/tutorial/friends.html

कक्षा AutoData में, आपको यह कार्य घोषित करना चाहिए:

आदि -
friend ostream& operator<< (ostream& out, const AutoData& obj); 
कक्षा के बाहर

, तो आप इस तरह इस समारोह परिभाषित करना चाहिए:

ostream& operator<< (ostream& out, const AutoData& obj) 
{ 
    out<<obj.mpg<<":"; 
     //do what you want 
    return out; 
} 
संबंधित मुद्दे