使用getline将字符串传递给对象而不使用额外的字符串变量

时间:2013-08-19 17:06:54

标签: c++ getline

所以我的问题很简单(我希望)。我目前有一个带有如下构造函数的Class:

Constructor(String szName)

字符串将保持名称;这可能超过一部分。所以John,John Smith,John H Smith,都必须是有效的输入。我知道我可以做到以下几点:

std::string input;

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

它会正常工作。但是,无论如何我直接将getline输入发送到我的构造函数?

提前感谢您的帮助。

3 个答案:

答案 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);

实际上,使用返回字符串的函数可能会导致另一个副本(但编译器将推出这个额外的副本)。