2014-02-22 150 views
0

我做這個C++代碼:C++:返回參考臨時

std::string const &  Operand::toString() const 
{ 
    std::ostringstream convert; 
    convert << this->value; 
    return convert.str(); 
} 

編譯器告訴我:returning reference to temporary

我是被迫把convert.str()Operand類?

編輯:這是針對學校鍛鍊,我不能改變的原型

+0

只是返回價值和秩序將被恢復。 – 0x499602D2

+0

爲什麼使用ostringstream將值轉換爲字符串?這個 - >值的類型是什麼? – kfsone

+0

目前,它是一個整數,但後來它將成爲一個模板變量 –

回答

5
convert.str(); 

這將返回其將後Operand::toString()回報被破壞的std::string對象。因此這是臨時變量,其生命期限於此功能的範圍。您應該僅返回string本身,按值:

std::string Operand::toString() const 
{ 
    std::ostringstream convert; 
    convert << this->value; 
    return convert.str(); 
} 

或:

const std::string Operand::toString() const 
{ 
    std::ostringstream convert; 
    convert << this->value; 
    return convert.str(); 
} 
+0

最後的功能將不起作用。它不是一個成員函數,並且'this-> value'不會作爲結果存在..也許你打算把'value'作爲參數或者使函數成爲一個成員? – Brandon

+0

當然,我已經添加了Operand ::,這是一個成員函數 – 4pie0

4

只是換回一個std::string而不是std::string const &功能。你想在這裏返回值。

+0

這是一個學校練習,我不能改變原型 –

+0

@JérémyPouyet嗯...然後將'str()'分配給靜態'std :: string'並返回它。 – 0x499602D2

+2

或者'Operand'應該有一個你應該返回一個const引用的成員字符串。 –

1

只需卸下&和const

std::string Operand::toString() const 
{ 
    std::ostringstream convert; 
    convert << this->value; 
    return convert.str(); 
} 
0

如果你不能改變的原型 - 它必須返回引用,而不是字符串本身 - 你必須保持字符串在某處並返回對它的引用。也許創建一個靜態字符串,將convert.str()賦值給它並返回對這個靜態字符串的引用。

std::string const & Operand::toString() const 
{ 
    static std::string s; 
    std::ostringstream convert; 
    convert << this->value; 
    s = convert.str(); 
    return s; 
} 

另一種解決方案是推薦由大衛·施瓦茨(在不同的答案)發表評論,但它取決於你是否能該成員字符串添加到Operand

+0

爲什麼它不能通過值返回const字符串? – 4pie0

+0

@piotruś按值返回可能是最好的解決方案,但正如所述的那樣,不能更改'Operand :: toString()'的聲明。 – Messa

+0

如果調用方保留返回的引用並在多個對象上調用'toString',這將導致非常混淆的行爲。我不會推薦這個。如果需要返回引用,它應該是對成員的引用,每次在另一個對象上調用toString時,至少不會覆蓋它。 – sepp2k