所以我的问题很简单(我希望)。我目前有一个带有如下构造函数的Class:
Constructor(String szName)
字符串将保持名称;这可能超过一部分。所以John,John Smith,John H Smith,都必须是有效的输入。我知道我可以做到以下几点:
std::string input;
getline(cin, input);
myClass Foo(input);
它会正常工作。但是,无论如何我直接将getline输入发送到我的构造函数?
提前感谢您的帮助。
答案 0 :(得分:3)
好吧,如果你可以做另一个功能,你可以这样做:
std::string readLine()
{
std::string input;
getline(cin, input);
return input;
}
然后像这样初始化你的类:
myClass Foo(readLine());
答案 1 :(得分:1)
没有必要这样做。它只是语义糖,因为字符串仍然需要存储相同的内存。如果您担心在更大的代码块中增加额外的变量会增加内存使用量,您可以使用{}围绕getline调用,如下所示:
{
string input;
getline(cin, input);
myClass Foo(input);
}
变量只存在于这样的块内。但这样做没有什么大的优势(至少不是这么简单的代码)。
答案 2 :(得分:0)
如果你真的想避免不必要的副本,那么你应该将Constructor(String szName)
变成Constructor(const String& szName)
- 这样就可以避免在进入构造函数的过程中复制字符串(你可能需要复制它)在构造函数内)。
以这种或那种方式,您需要将getline
的输出存储在一个字符串中(除非您碰巧希望编写自己的getline
返回一个字符串,但这仍然不会帮助避免副本超过基本:
std :: string str; getline(cin,str); myClass foo(str);
实际上,使用返回字符串的函数可能会导致另一个副本(但编译器将推出这个额外的副本)。