在我的标题文件中,我有以下内容:
private:
ImagePixmapItem *item;
在函数中,我创建一个新的ImagePixmapItem,如下所示:
ImagePixmapItem *item(static_cast<ImagePixmapItem *>(scene.addPixmap(p)));
但是,这会创建项目的本地副本。 但如果我这样做:
*item(static_cast<ImagePixmapItem *>(scene.addPixmap(p)));
我收到以下错误:
error: ‘((ViewerMain*)this)->ViewerMain::item’ cannot be used as a function
那么拨打这个电话的正确方法是什么?
答案 0 :(得分:2)
初始化如
item(static_cast<ImagePixmapItem *>(scene.addPixmap(p)));
只允许在您的变量声明中(这实际上是您的第一个带有局部变量的示例)或构造函数初始化列表中的(对于成员字段):
ViewerMain::ViewerMain() :
item(static_cast<ImagePixmapItem *>(scene.addPixmap(p)))
{
...
}
在成员函数中,只需赋值给它:
item = static_cast<ImagePixmapItem *>(scene.addPixmap(p));
(因为它是私有的,所以不能从非成员函数访问它,除非它是该类的朋友。)
答案 1 :(得分:1)
您需要使用作业:
item = static_cast<ImagePixmapItem *>(scene.addPixmap(p));
答案 2 :(得分:1)
如果它是该类的成员函数,只需执行:
item = static_cast<ImagePixmapItem *>(scene.addPixmap(p));
如果它不是成员,你必须提供一种方法来分配私有成员变量,比如说,通过setter成员方法:
void setItem( ImagePixmapItem* i ) { item = i; }
答案 3 :(得分:0)
使用*item = static_cast<ImagePixmapItem *>(scene.addPixmap(p));
除非你在构造函数中这样做,在这种情况下你可以使用...
ViewerMain::ViewerMain (...):
item (static_cast<ImagePixmapItem *>(scene.addPixmap(p)))
{}
答案 4 :(得分:0)
您应该尝试为您想要完成的工作和地点提供更多背景信息。您可以看到不同的答案将您的代码解释为初始化列表的一部分或函数体中的语句 - 两种解释在没有更多上下文的情况下都是有效的。
现在,我的解释是你在一个函数内,并且你想设置成员item
来引用对scene.addPixmap(p);
的调用结果。如果是这种情况,您应该使用赋值。
如果您遵循第一个块,问题是您正在创建一个隐藏成员属性的局部变量,并初始化它,但这不会更改成员属性item
。
如果从声明中删除类型,则作用域中将没有本地item
,编译器将发现标识符引用了成员属性,这就是您想要的。在此阶段,编译器将行*item(param)
解释为在属性operator()
上调用item
,并对结果进行引用。由于item
是指针,因此无法应用operator()
并生成错误消息: item不能用作函数。
正如其他人所指出的那样,解决方案是分配而不是尝试使用仅在局部变量的定义点或成员属性的初始化列表中可用的初始化语法。