2012-05-09 6 views
9

मेरे पास मेरे कोड में एक enum है जो निम्नलिखित है: enum Status {In-Active, Active};। एक स्थिति ऑब्जेक्ट Person ऑब्जेक्ट को पैरामीटर के रूप में पास कर दिया गया है, इसलिए मैं चाहता हूं कि उपयोगकर्ता सक्रिय या इन-एक्टिव में प्रवेश करे और उन्हें स्थिति चर में सहेजें। मैं यह कैसे कर सकता हूँ? मैंने इसे पहले कोशिश की लेकिन यह काम नहीं किया।सी ++ enum और उपयोगकर्ता से इनपुट करने के लिए उनका उपयोग

यहाँ मेरी कोड है:

Compiling: C:\Users\KiKo-SaMa\Desktop\C++\Person.cpp 
C:\Users\KiKo-SaMa\Desktop\C++\Person.cpp: In function 'int main()': 
C:\Users\KiKo-SaMa\Desktop\C++\Person.cpp:36:38: error: no match for 'operator>>' in 'std::cin >> status' 
C:\Users\KiKo-SaMa\Desktop\C++\Person.cpp:36:38: note: candidates are: 
c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/istream:122:7: note: std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(std::basic_istream<_CharT, _Traits>::__istream_type& (*)(std::basic_istream<_CharT, _Traits>::__istream_type&)) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_istream<_CharT, _Traits>::__istream_type = std::basic_istream<char>] 
c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/istream:122:7: note: no known conversion for argument 1 from 'Status' to 'std::basic_istream<char>::__istream_type& (*)(std::basic_istream<char>::__istream_type&) {aka std::basic_istream<char>& (*)(std::basic_istream<char>&)}' 
c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/istream:126:7: note: std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(std::basic_istream<_CharT, _Traits>::__ios_type& (*)(std::basic_istream<_CharT, _Traits>::__ios_type&)) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_istream<_CharT, _Traits>::__istream_type = std::basic_istream<char>, std::basic_istream<_CharT, _Traits>::__ios_type = std::basic_ios<char>] 
c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/istream:126:7: note: no known conversion for argument 1 from 'Status' to 'std::basic_istream<char>::__ios_type& (*)(std::basic_istream<char>::__ios_type&) {aka std::basic_ios<char>& (*)(std::basic_ios<char>&)}' 
c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/istream:133:7: note: std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(std::ios_base& (*)(std::ios_base&)) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_istream<_CharT, _Traits>::__istream_type = std::basic_istream<char>] 
c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/istream:133:7: note: no known conversion for argument 1 from 'Status' to 'std::ios_base& (*)(std::ios_base&)' 
c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/istream:169:7: note: std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(bool&) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_istream<_CharT, _Traits>::__istream_type = std::basic_istream<char>] 
c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/istream:169:7: note: no known conversion for argument 1 from 'Status' to 'bool&' 
c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/istream:173:7: note: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(short int&) [with _CharT = char, _Traits = std::char_traits<char>] 
c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/istream:173:7: note: no known conversion for argument 1 from 'Status' to 'short int&' 
c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/istream:176:7: note: std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(short unsigned int&) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_istream<_CharT, _Traits>::__istream_type = std::basic_istream<char>] 
c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/istream:176:7: note: no known conversion for argument 1 from 'Status' to 'short unsigned int&' 
c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/istream:180:7: note: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(int&) [with _CharT = char, _Traits = std::char_traits<char>] 
c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/istream:180:7: note: no known conversion for argument 1 from 'Status' to 'int&' 
c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/istream:183:7: note: std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(unsigned int&) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_istream<_CharT, _Traits>::__istream_type = std::basic_istream<char>] 
c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/istream:183:7: note: no known conversion for argument 1 from 'Status' to 'unsigned int&' 
c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/istream:187:7: note: std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(long int&) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_istream<_CharT, _Traits>::__istream_type = std::basic_istream<char>] 
c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/istream:187:7: note: no known conversion for argument 1 from 'Status' to 'long int&' 
c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/istream:191:7: note: std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(long unsigned int&) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_istream<_CharT, _Traits>::__istream_type = std::basic_istream<char>] 
c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/istream:191:7: note: no known conversion for argument 1 from 'Status' to 'long unsigned int&' 
c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/istream:196:7: note: std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(long long int&) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_istream<_CharT, _Traits>::__istream_type = std::basic_istream<char>] 
c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/istream:196:7: note: no known conversion for argument 1 from 'Status' to 'long long int&' 
c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/istream:200:7: note: std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(long long unsigned int&) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_istream<_CharT, _Traits>::__istream_type = std::basic_istream<char>] 
c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/istream:200:7: note: no known conversion for argument 1 from 'Status' to 'long long unsigned int&' 
c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/istream:205:7: note: std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(float&) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_istream<_CharT, _Traits>::__istream_type = std::basic_istream<char>] 
c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/istream:205:7: note: no known conversion for argument 1 from 'Status' to 'float&' 
c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/istream:209:7: note: std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(double&) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_istream<_CharT, _Traits>::__istream_type = std::basic_istream<char>] 
c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/istream:209:7: note: no known conversion for argument 1 from 'Status' to 'double&' 
c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/istream:213:7: note: std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(long double&) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_istream<_CharT, _Traits>::__istream_type = std::basic_istream<char>] 
c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/istream:213:7: note: no known conversion for argument 1 from 'Status' to 'long double&' 
c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/istream:217:7: note: std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::operator>>(void*&) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_istream<_CharT, _Traits>::__istream_type = std::basic_istream<char>] 
c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/istream:217:7: note: no known conversion for argument 1 from 'Status' to 'void*&' 
c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/istream:241:7: note: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(std::basic_istream<_CharT, _Traits>::__streambuf_type*) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_istream<_CharT, _Traits>::__streambuf_type = std::basic_streambuf<char>] 
c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/istream:241:7: note: no known conversion for argument 1 from 'Status' to 'std::basic_istream<char>::__streambuf_type* {aka std::basic_streambuf<char>*}' 
c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/bits/basic_string.tcc:998:5: note: template<class _CharT, class _Traits, class _Alloc> std::basic_istream<_CharT, _Traits>& std::operator>>(std::basic_istream<_CharT, _Traits>&, std::basic_string<_CharT, _Traits, _Alloc>&) 
c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/bits/istream.tcc:957:5: note: template<class _CharT2, class _Traits2> std::basic_istream<_CharT, _Traits>& std::operator>>(std::basic_istream<_CharT, _Traits>&, _CharT2*) 
c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/bits/istream.tcc:925:5: note: template<class _CharT, class _Traits> std::basic_istream<_CharT, _Traits>& std::operator>>(std::basic_istream<_CharT, _Traits>&, _CharT&) 
c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/istream:709:5: note: template<class _Traits> std::basic_istream<char, _Traits>& std::operator>>(std::basic_istream<char, _Traits>&, unsigned char&) 
c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/istream:714:5: note: template<class _Traits> std::basic_istream<char, _Traits>& std::operator>>(std::basic_istream<char, _Traits>&, signed char&) 
c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/istream:756:5: note: template<class _Traits> std::basic_istream<char, _Traits>& std::operator>>(std::basic_istream<char, _Traits>&, unsigned char*) 
c:\mingw\bin\../lib/gcc/mingw32/4.6.2/include/c++/istream:761:5: note: template<class _Traits> std::basic_istream<char, _Traits>& std::operator>>(std::basic_istream<char, _Traits>&, signed char*) 
Process terminated with status 1 (0 minutes, 0 seconds) 
43 errors, 0 warnings 

जहाँ मेरे कोड गलती कर दी:

#include <iostream> 

using namespace std; 

enum Status {InActive, Active}; 

class Person { 
    private: 
     string name; 
     int age; 
     Status status; 

    public: 
     Person (const string &_name, const int _age, const Status _status) : name(_name), age(_age), status(_status) {} 

     string &getName() { return name; } 
     int getAge() { return age; } 
     Status getStatus() { return status; } 

     void setName (const string &_name) { name = _name; } 
     void setAge (const int _age) { age = _age; } 
     void setStatus (const Status _status) { status = _status; } 
}; 

//////////////////////////////////////////////////////////////////////////////// 
///////////////////////////////// Main Method ////////////////////////////////// 
//////////////////////////////////////////////////////////////////////////////// 

int main() { 
    string name; 
    int age; 
    Status status; 

    cout << "Enter a name: "; getline(cin, name); 
    cout << "Enter age: "; cin >> age; 
    cout << "Enter status: "; cin >> status; 

    Person p(name, age, status); 

    return 0; 
} 

और यहाँ त्रुटि मुझे मिल गया है (इस बिल्ड लॉग है)? धन्यवाद

+0

बस के लिए +1 से संशोधित किया गया है उदाहरण के लिए एक पूर्ण उदाहरण आप में प्रयास डाल दिया जा रहा है "यहाँ मैं क्या करने की कोशिश की है"! – Flexo

उत्तर

13

आप enum मान नहीं पढ़ सकते हैं सीधे, आप एक std::map कि एक enum मूल्य के लिए उपयोगकर्ता इनपुट के नक्शे की आवश्यकता होगी।

std::map<std::string,Status> m; 
m["In-Active"] = In-Active; 
m["Active"] = Active; 

std::string sstatus; 
cin >> sstatus; 
Status status = m[sstatus]; 
+0

मैं देखता हूं। मदद के लिए धन्यवाद लुचियन :) –

1
  • Enum वस्तुओं संकलन समय पर पार्स किया जा रहा है और यह केवल निरंतर पूर्णांक मान हो सकते हैं।

  • व्यक्ति पी (नाम, आयु, स्थिति); // यहां स्टेटस ऑब्जेक्ट का उपयोग किए बिना आपको "इन-एक्टिव" या "एक्टिव" जैसे मूल्य सीधे भेजना चाहिए। तो उपयोगकर्ता से वें स्थिति क्षेत्र के बारे में कोई इनपुट नहीं होगा।

enum स्थिति {InActive, Active};

  • यहां स्थिति एक enum वर्ग है और बनाई गई किसी ऑब्जेक्ट में "निष्क्रिय" या "सक्रिय" मान होंगे। यदि आप कुछ अन्य मान असाइन करने का प्रयास करते हैं तो आपको एक कंपाइलर त्रुटि मिल जाएगी।

स्थिति की स्थिति;

  • यहां स्थिति एक enum ऑब्जेक्ट बनाई गई है और इसमें कचरा मूल्य है।

cout < < "स्थिति दर्ज करें:"; सीन >> स्थिति;

  • यहां आप एक एनम ऑब्जेक्ट के लिए इनपुट के लिए उपयोगकर्ता से पूछ रहे हैं जो संकलक के लिए पूरी तरह से अमान्य है।
1

आप कक्षा के अंदर enum लपेट सकते हैं और ऑपरेटर प्रदान कर सकते हैं >>। यह एक इस लिंक http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Type_Safe_Enum

#include <iostream> 

template<typename def> 
class safe_enum : public def 
{ 
public: 
    int val; 
    safe_enum(int v) : val(v) {} 
// inner underlying() const { return val; } 
    bool operator == (const safe_enum & s) const { return this->val == s.val; } 
    bool operator != (const safe_enum & s) const { return this->val != s.val; } 
    bool operator < (const safe_enum & s) const { return this->val < s.val; } 
    bool operator <= (const safe_enum & s) const { return this->val <= s.val; } 
    bool operator > (const safe_enum & s) const { return this->val > s.val; } 
    bool operator >= (const safe_enum & s) const { return this->val >= s.val; } 
}; 

struct status_def { 
    enum type { NoValue, InActive, Active }; 
}; 
typedef safe_enum<status_def> Status; 

std::istream& operator>>(std::istream& Istr, Status& other) 
{ 
    std::cout << "Enter Status value: " << std::endl; 
    //here the logic to handle input error 
    Istr >> other.val; 
    return Istr; 
} 

std::ostream& operator<<(std::ostream& os,const Status& toPrint) 
{ 
    if (toPrint.val == Status::Active) 
     return os << "Active"; 
    if (toPrint.val == Status::NoValue) 
     return os << "NoValue"; 
    if (toPrint.val == Status::InActive) 
     return os << "InActive"; 
    throw; 
} 

int main(void) 
{ 
    Status test(Status::NoValue); 
    std::cout << test << std::endl; 
    std::cin >> test; 
    std::cout << test << std::endl; 
} 
+1

मूल मुद्दा यह था कि एनम के लिए कोई ऑपरेटर नहीं है (कंपाइलर आउटपुट देखें)। मुझे नहीं पता कि यह कैसे तय किया गया है क्योंकि safe_enum :: ऑपरेटर >> enum (Istr >> other.val;) के लिए अभी भी एक ही गैर-मौजूदा ऑपरेटर का उपयोग करता है। – stefaanv

+0

मुझे यह तथ्य भी पसंद नहीं है कि आप enum के लिए 'int' मान रहे हैं। यह जरूरी नहीं है। सी ++ 11 इसे पूछने के लिए 'std :: underlying_type' जोड़ता है, मुझे सी ++ 03 के बारे में पता नहीं है ... ओह ...और यह स्कोपिंग मुद्दे से मदद नहीं करता है। –

+0

कोड संकलित और काम करते हैं। –