Qt: функция возвращает объект, помещая его в указатель - PullRequest
0 голосов
/ 12 октября 2010

Надеюсь, это не слишком глупо, но я хочу убедиться, что я все делаю правильно.

Некоторые функции Qt возвращают объекты Qt в качестве значений, но мы можем захотеть сохранить их где-нибудь в указателе. Например, в QDomDocument функция documentElement возвращает QDomElement, а не указатель на него. Теперь, как член моего класса, у меня есть:

QDomElement *listRootElement;

В функции, которая устанавливает вещи, я использую это:

listRootElement = new QDomElement;
*listRootElement = mainIndex->documentElement();

(mainIndex - это QDomDocument.)

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

Это было бы очень похоже на некоторые функции изображения, где может быть возвращена QPixmap, и я хочу сохранить указатели на QPixMap.

Спасибо за любые комментарии!

Ответы [ 3 ]

0 голосов
/ 12 октября 2010

Я предполагаю, но я думаю, что это:

listRootElement = new QDomElement(mainIndex->documentElement());

... может позволить компилятору лучше оптимизировать (см. этот вопрос для некоторых рассуждений).

0 голосов
/ 13 декабря 2010

Вы перезаписываете изначально выделенный объект:

QDomElement *listRootElement; // undefined ptr value, I'd prefer null or new right away
listRootElement = new QDomElement;
*listRootElement = mainIndex->documentElement();

По сути, вы делаете:

int *x = new int(42);
*x = 47;

Это работает, потому что и QDomElement, и int реализуют оператор присваивания (=).

Обратите внимание, что не нужно ничего удалять, так как возвращенный временный объект копируется в вновь выделенный объект.

0 голосов
/ 12 октября 2010

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

Единственное, что нужно иметь в виду, это то, что популярная система «родитель заботится об удалении детей», которую использует Qt, доступна только для QObject (под) классов. Поэтому, когда new QString или QDomElement или что-то в этом роде, имейте в виду, что вы делаете должны delete тоже это сделать сами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...