2011-01-21 50 views
1

在我的头文件中,我有以下几点:如何给这个变量全局范围

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

也许你可以提供一点上下文。我希望`private:`在`class`的定义之内。很难说出你想要做什么或者为什么你需要所有的演员和指针。 – 2011-01-21 17:42:36

+0

是的,私人是在一个类的定义之内。我使用我自己的类来扩展QGraphicsPixmapItem的功能,这就是为什么有这些类型。 – Derek 2011-01-21 17:47:11

回答

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

您需要使用赋值:如果它是一个成员

item = static_cast<ImagePixmapItem *>(scene.addPixmap(p)); 
1

之类的功能,只是做:

item = static_cast<ImagePixmapItem *>(scene.addPixmap(p)); 

如果不是会员,你就必须提供一种方式来指派私有成员变量,比如,通过设置成员方法:

void setItem(ImagePixmapItem* i) { item = i; } 
0

使用*item = static_cast<ImagePixmapItem *>(scene.addPixmap(p));

,除非你在你的构造函数,在这种情况下,你可以用做...

ViewerMain::ViewerMain (...): 
    item (static_cast<ImagePixmapItem *>(scene.addPixmap(p))) 
{} 
0

你应该尝试提供更多的情况下进入你想要做什么和哪里。您可以看到,不同的答案将您的代码解释为初始化列表的一部分或者函数体中的语句 - 两种解释在没有更多上下文的情况下都是有效的。

现在,我的解释是,你在一个函数中,并且你想设置成员item来引用对scene.addPixmap(p);的调用结果。如果是这样,你应该使用分配。

如果您关注第一个块,则问题在于您正在创建隐藏成员属性的本地变量,并且初始化该属性,但这不会更改成员属性item

如果您从声明中删除类型,范围内将不会有本地item,编译器会发现标识符引用了您想要的成员属性。在此阶段,编译器将该行解释为:*item(param)在属性item上调用operator(),并引用结果。由于item是一个指针,因此无法应用operator()并生成错误消息:项目不能用作函数

正如其他人指出的,解决方案是分配,而不是尝试使用初始化语法,该语法仅在定义点用于局部变量,或者在初始化列表中用于成员属性。