как дать этой переменной глобальную область видимости - PullRequest
1 голос
/ 21 января 2011

В моем заголовочном файле у меня есть следующее:

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

Так, как правильно сделать этот звонок?

Ответы [ 5 ]

2 голосов
/ 21 января 2011

Инициализация, подобная

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

, разрешена только в объявлении вашей переменной (на самом деле это ваш первый пример с локальной переменной) или (для полей-членов) в списке инициализации конструктора:

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

Внутри функции-члена просто присвойте ей:

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

(Так как она является закрытой, она не доступна из функции, не являющейся членом, кроме случаев, когда она является другомкласс.)

1 голос
/ 21 января 2011

Если это член функция класса, просто выполните:

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

Если это не член, вам нужно предоставить способ присвоения этой закрытой переменной члена, скажем, с помощью метода члена установки:

void setItem( ImagePixmapItem* i ) { item = i; }
1 голос
/ 21 января 2011

Вам необходимо использовать назначение:

item = static_cast<ImagePixmapItem *>(scene.addPixmap(p));
0 голосов
/ 21 января 2011

Вы должны попытаться предоставить больше контекста того, что вы хотите сделать и где. Вы можете видеть, что разные ответы интерпретируют ваш код как часть списка инициализации или оператора в теле функции - обе интерпретации допустимы без дополнительного контекста.

Теперь моя интерпретация заключается в том, что вы находитесь внутри функции и хотите, чтобы элемент item указывал на результат вызова scene.addPixmap(p);. Если это так, вы должны использовать присваивание.

Проблема, если вы следуете первому блоку, состоит в том, что вы создаете локальную переменную, которая скрывает атрибут участника, и инициализируете его, но это не меняет атрибут члена item.

Если вы удалите тип из объявления, в области действия не будет локального item, и компилятор обнаружит, что идентификатор ссылается на атрибут member, что вам и нужно. На этом этапе компилятор интерпретирует строку: *item(param) как вызов operator() для атрибута item и разыменование результата. Поскольку item является указателем, он не может применить operator() и выдает сообщение об ошибке: элемент не может использоваться как функция .

Как уже указывали другие, решение заключается в назначении вместо попытки использовать синтаксис инициализации, который доступен только в точке определения для локальных переменных или в списке инициализации для атрибутов элементов.

0 голосов
/ 21 января 2011

Использование *item = static_cast<ImagePixmapItem *>(scene.addPixmap(p));

если вы не сделаете это в своем конструкторе, в этом случае вы можете использовать ...

ViewerMain::ViewerMain (...):
    item (static_cast<ImagePixmapItem *>(scene.addPixmap(p)))
{}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...