3

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

Constructor(String szName)

该字符串将包含一个名称;这可能不止一个部分。因此,John、John Smith、John H Smith 必须都是有效输入。我知道我可以做到以下几点:

std::string input;

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

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

提前谢谢你的帮助。

4

3 回答 3

3

好吧,如果你对制作另一个函数没问题,你可以这样做:

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

然后像这样初始化你的类:

myClass Foo(readLine());
于 2013-08-19T17:11:03.177 回答
1

这样做没有任何意义。这只是语义糖,因为字符串仍然需要存储相同的内存量。如果您担心在更大的代码块中添加额外的变量会增加内存使用量,您可以使用 {} 包围 getline 调用,如下所示:

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

并且该变量将仅存在于此类块中。但是这样做并没有太大的优势(至少对于这么简单的代码来说不是)。

于 2013-08-19T17:21:30.610 回答
0

如果您真的想避免不必要的复制,那么您应该制作Constructor(String szName)-Constructor(const String& szName)这样,您可以避免字符串在进入构造函数的过程中被复制(您可能需要在构造函数中复制它)。

以一种或另一种方式,您需要将输出存储getline在一个字符串中(除非您碰巧希望编写自己的getline返回字符串,但这仍然无助于避免复制,而不是基本的:

标准::字符串字符串;获取线(cin,str);我的类 foo(str);

事实上,使用返回字符串的函数可能会导致另一个副本(但编译器可能会删除那个额外的副本)。

于 2013-08-19T17:45:32.043 回答