2016-10-31 4 views
0

방금 ​​질문이 있습니다. + = 연산자를 오버로드하여 문자열을 반환 할 수 있습니까? 여기에 내가 시도했지만, 성공하지 못했습니다.문자열을 반환하는 + = 연산자를 오버로드하는 방법은 무엇입니까?

// 'Student' is the class that this function is in 
// 'get_name()' returns the name of the student 
// 'get_grade()' returns the grade of the student 
// Description: 
// Ultimately I will be creating a list of students and their grades in 
// the format of (Student1, Grade1) (Student2, Name2) ... (StudentN, GradeN) 
// in a higher level class, and thus I need an overloaded += function. 
Student& Student::operator+=(const Student& RHS) 
{ 
    string temp_string; 
    temp_string = "(" + RHS.get_name() + ", " + RHS.get_grade() + ") "; 
    return temp_string; 
} 
+4

반환 형식을'std :: string'으로 변경 하시겠습니까? – NathanOliver

+2

@ NathanOliver 당신은 어떻게 그 아이디어를 생각해 냈습니까? o_o – DeiDei

+2

이것은 혼란스럽고 예상치 못한 일일 것임을 명심하십시오. 현재 오브젝트를 수정하는 것조차 보이지 않는 것 같습니다. 나는 이것을하지 않을 것을 제안 할 것이다. – Falmarri

답변

7

순수 기술적 :

// v NO reference here! 
std::string Student::operator+=(const Student& rhs) 
{ 
    string temp_string; 
    temp_string = "(" + rhs.get_name() + ", " + rhs.get_grade() + ") "; 
    return temp_string; 
} 

하지만 :

은 무엇 이것의 의미한다? 아주 먼저, 일반적으로 두 명의 학생들의 합계가 어떻게 될까요? 다른 학생? 어떻게 그것을 인간 언어로 해석하겠습니까? 이미 혼란스러워지기 시작합니다.

int x = 10; 
x += 12; 

당신은 이후 특히 값 (22)을 보유 x 기대 : x는 수정되었다 (당신은 ... 제로를 추가하지 않는 한) 그런 다음에 봐. 반대로 운영자는 어떤 식 으로든 this을 수정하지 않습니다. 심지어 보지도 않습니다 ... this에 다른 학생을 추가하는 것을 어떻게 해석 하시겠습니까?? 특히 : 연산자 + 두 학생 수용, 당신은 일종의 쌍 또는 가족을 반환 할 수 있지만 + =, 결과 유형을 변경 ??? x += 7이 x를 수정하지 않았지만 double을 반환하면 어떻게 될까요? 이 모든 것이 혼란 스러울 때 어떻게 보이나요? 한편

, 나는 당신이 실제로 대신 명시 적 캐스트 연산자 찾고있는,하지만 상상할 수 :

operator std::string() 
{ 
    std::string temp_string; 
    temp_string = "(" + this->get_name() + ", " + this->get_grade() + ") "; 
    return temp_string; 
} 

이 방법을 사용하면 전자, 문자열로 학생을 추가 할 수 있습니다. 지. like :

Student s; 
std::string str; 
str += s; 

또는 출력 스트림을 전달 하시겠습니까?

operator std::string() 
{ 
    std::ostringstream s; 
    s << *this; 
    return s.str(); 
} 

그것도 가능은 하나 라이너 가지고 : 그런 다음이 :에 위와

std::ostream& operator<<(std::ostream& stream, Student const& s) 
{ 
    stream << "(" << s.get_name() << ", " << s.get_grade() << ") "; 
    return stream; 
} 

, 당신은 캐스트 연산자를 줄일 수는 경우

operator std::string() 
{ 
    return static_cast < std::ostringstream& >(std::ostringstream() << *this).str(); 
} 

음을 인정했다 이 캐스팅을 사용하면 정말 좋을 것입니다 ...

+0

피드백에 감사드립니다. 정말 고맙습니다. 내가 말한 것을 살펴볼 것입니다. (틀림없이, 오버로드가 잘되지 않아서 설명이 도움이되었습니다.) –

+0

그래서 구현했습니다 : 연산자 std :: string() { std :: string temp_string; temp_string = "("+ this-> get_name() + ","+ this-> get_grade() + ")"; return temp_string; } 완벽하게 작동하지만 get_grade는 float를 반환합니다. 이 컨텍스트 내에서이를 문자열로 변환하는 방법에 대한 아이디어가 있습니까? 감사합니다. –

+1

@SamTalbot'std :: to_string'? – immibis