带有istringstream的C ++构造函数不起作用

时间:2014-05-19 12:13:35

标签: c++

我有两类构造函数的类:

MyClass(istringstream& is)
{
    string line;
    getline(is, line);

    m_name = line;
}

MyClass() : m_name"whatever" {}

但是我把它称为主要内容:

MyClass myCLASS;

istringstream is.str("Somestring");

myCLASS(is);

Compilator说错误:无法调用'(CTrain)(std :: istringstream&)'

请你告诉我为什么?

3 个答案:

答案 0 :(得分:1)

你有很多错误。

首先,您的初始化列表缺少一对括号;它应该是

MyClass() : m_name("whatever") {}

其次,您对is的声明是错误的 - 您无法在自己的声明中调用对象上的函数。
它应该是这样的:

istringstream is("Somestring");

第三,和错误消息的来源,你不能显式调用构造函数 - 它在初始化对象时自动调用。

在您的代码中,myCLASS对象已经构建,行

myCLASS(is);

表示“调用MyClass的函数调用操作符,可以将istringstream作为参数。

这样的功能可能看起来像void operator() (istringstream&),但你的代码中没有这样的东西 这绝对不是你的意思。

您应该更改对象声明的顺序,如下所示:

istringstream is("Somestring");
MyClass myCLASS(is);

答案 1 :(得分:0)

构造函数只能在声明点调用,而不能在以后调用。

  MyClass myCLASS(is); // invokes a constructor
  myCLASS(is); // does not invoke a constructor

答案 2 :(得分:0)

你试图在构造该类的对象之后调用MyClass构造函数 - 你不能这样做。在这一行:

MyClass myCLASS;

已经调用了默认构造函数(MyClass())。在这一行:

myCLASS(is);

您正在调用已实例化对象的构造函数(即第二次调用构造函数)。

为了工作,您的代码应该如下所示:

istringstream is("Somestring");
MyClass myCLASS(is);

如果您确实需要调用已经实例化的对象的构造函数,您可能需要阅读:

Can you invoke an instantiated object's class constructor explicity in C++?