2011-01-21 48 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()並生成錯誤消息:項目不能用作函數

正如其他人指出的,解決方案是分配,而不是嘗試使用初始化語法,該語法僅在定義點用於局部變量,或者在初始化列表中用於成員屬性。