2013-08-19 29 views
3

所以我的問題很簡單(我希望)。我目前有一個構造類的類看起來像這樣:使用getline將字符串傳遞給對象而不使用額外的字符串變量

Constructor(String szName) 

該字符串將持有一個名稱;這可能是更多的一部分。所以約翰,約翰史密斯,約翰史密斯,都必須是有效的投入。我知道我可以做到以下幾點:

std::string input; 

getline(cin, input); 
myClass Foo(input); 

它會正常工作。但是,無論如何,直接將getline輸入發送給我的構造函數嗎?

非常感謝您提前給予的幫助。

+0

是的。對不起。 –

+1

不要對不起,只是編輯問題:) – jrok

回答

3

好吧,如果你是用細做其他功能,你可以做這樣的:

std::string readLine() 
{ 
    std::string input; 
    getline(cin, input); 
    return input; 
} 

然後初始化類像這樣:

myClass Foo(readLine()); 
+0

這將工作正常,但它仍然需要我創建另一個字符串變量。當然,變量會很快超出範圍。但我希望有一種方法可以在不創建新變量的情況下實現。還是要謝謝你的幫助。這將很好地工作 –

1

有中沒有點這樣做。這將只是語義糖,因爲字符串仍然需要相同的內存容量來存儲。如果您擔心的代碼塊較大的具有附加變量將提高內存的使用,你可以與周圍{}函數getline電話如下:

{ 
    string input; 
    getline(cin, input); 
    myClass Foo(input); 
} 

和變量會存在只有這樣的塊內。但是這樣做沒有什麼大的優勢(至少不是這麼簡單的代碼)。

+0

娜,它只是爲了滿足我自己的強迫症。但是謝謝你的幫助。 –

0

如果你真的想避免不必要的副本,那麼你應該將Constructor(String szName)轉換爲Constructor(const String& szName) - 這樣,你可以避免字符串被拷貝到構造函數的路上(你可能需要在構造函數中拷貝它)。

在這種或那種方式,你需要從getline輸出存儲在一個字符串(除非你想編寫自己的getline返回一個字符串,但仍然不能避免拷貝任何不是更基本:

的std ::字符串str; 函數getline(CIN,STR); MyClass的富(STR);

事實上,使用返回字符串的函數可能會導致另一個副本(但是編譯器將可能擺脫多餘的副本)

相關問題