2016-10-31 81 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; 

您希望x事後保存值22。特別是:X得到了修改(除非你加入零...)。相反,您的運營商不會以任何方式修改this - 它甚至不會查看...您如何解釋將另一個學生添加到this現在?特別是:用一個操作員+接受兩個學生,你可能已經返回某種配對或家庭,但用+ =,改變結果類型?如果x += 7未修改x,但返回了雙精度?你看到這一切有多混淆?

在另一方面,我能想象,雖然,你實際上是在尋找明確的投操盤手:

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

通過這種方式,你可以學生添加到字符串,如G。像這樣:

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

還是你想對學生傳遞到輸出流?那麼這樣的:

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

有了上面,你可以減少投運營商:

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

它甚至可以有一個襯墊:

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

好吧,承認,如果是真的更好,這個演員陣容是有爭議的...

+0

感謝您的反饋,我真的很感激它:)我會研究你所說的話(無可否認,我不是很擅長超載,所以你的解釋確實有幫助)。 –

+0

所以我實現了: operator std :: string() { std :: string temp_string; temp_string =「(」+ this-> get_name()+「,」+ this-> get_grade()+「)」; return temp_string; } 它完美的工作,但get_grade返回一個浮點數。任何想法如何將其轉換成此上下文中的字符串? 謝謝! –

+1

@SamTalbot'std :: to_string'? – immibis