调用构造函数而不将其赋值给任何变量c ++

时间:2012-11-02 08:45:25

标签: c++ constructor

这可能是一个非常愚蠢的问题,但我甚至不知道应该写什么来寻找答案。我甚至不确定我给的标题是否正确。

如果我有这样的构造函数:

CError(const std::string& msg) { showMessage(msg) }

我想这样称呼它......

CError("some message");

...一切正常,但是当在某个变量中指定了字符串时,我得到了一个错误"类CError的默认构造函数不存在":

std::string str = "some message";
CError(str);

当我这样写的时候,它有效:

std::string str = "some message";
CError err(str);

但我不需要这个err对象。

有人可以解释一下,为什么我只能打电话给构造函数呢?

提前感谢您的答案。

2 个答案:

答案 0 :(得分:8)

CError(str);被解析为CError str;,它定义了一个新变量str。我的编译器失败的方式不同,这使得问题更加明显:redefinition of 'str' with a different type

解决此问题的一个简单方法是转换对象:

(void)CError(str);

然而,亟待解决的问题是:为什么这样做?如果你不打算以任何方式使用构造的对象,为什么不简单地使它成为静态成员函数,甚至只是一个普通的旧函数?

答案 1 :(得分:4)

语句CError(str);被读作定义str类型的对象CError;它相当于CError str;,但名称为str括号。

要解决此问题,您还可以为类型名称加上括号:(CError)(str);。这会强制将语句读作函数转换表达式;你可以等同地写(CError) str;甚至static_cast<CError>(str);

在C ++ 11中,您可以使用通用初始化语法来编写CError{str};