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

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

Вот моя проблема.

У меня есть структура, которая выглядит примерно так:

QObject -> MyBase -> MyDerived

Затем у меня есть функция, которая будет принимать любой из производных типов как QPointer;

void function(QPointer<MyBase> base) {
   ...
}

Теперь проблема в том, что я не могу пройти QPointer<MyDerived> в эту функцию, что я бы сделал, если бы использовал стандартные указатели. Нужно ли приводить этот объект, чтобы он соответствовал функции? Или я должен просто использовать нормальные указатели?

Кроме того, кто-нибудь знает стандартное поведение, когда вы выделяете объект, который дает сбой? Должны ли вы всегда делать это в блоке try или оборачивать его во что-то, чтобы проверить, является ли оно нулевым или нет? Я прочитал документацию по Qt, и они сказали, что большинство их классов возвращали нулевое значение, если его не удалось выделить. Когда это утверждение верно и что я могу сделать, если я не хочу использовать try-catch?

2 ответа

Решение

Вы должны использовать обычный указатель. Это то, что Qt Document говорит об использовании QPoiner

"Защищенный указатель будет автоматически приведен к T *, так что вы можете свободно смешивать охраняемые и неохраняемые указатели. Это означает, что если у вас есть QPointer, вы можете передать его функции, которая требует QWidget *. По этой причине, не имеет смысла объявлять функции, принимающие QPointer в качестве параметра; *просто используйте обычные указатели*. Используйте QPointer, когда вы храните указатель во времени."

Как упомянул @Kunal, лучше передать необработанный указатель в вашем случае, но я вижу, что у вас возникают проблемы с владением указателем. Передавать необработанные указатели на методы объекта опасно, потому что, когда ваша кодовая база увеличивается, вы скоро запутаетесь в том, какой объект является владельцем данного конкретного указателя, и это может очень легко привести к утечкам памяти. По этой причине я бы рекомендовал использовать QSharedPointer вместо QPointer или даже необработанный указатель. QSharedPointer поддерживает полиморфизм, так что вы сможете передать его (в качестве значения) любой функции / объекту, который вам нужен, не беспокоясь о владении, потому что QSharedPointer станет владельцем указателя и удалит его, когда все последние экземпляры QSharedPointer уйдут выходит за рамки.

Другие вопросы по тегам