QPointer, содержащий производный объект, не будет совпадать с базовым классом
Извините за странный заголовок, не стесняйтесь придумать лучший, если можете придумать.
Вот моя проблема.
У меня есть структура, которая выглядит примерно так:
QObject -> MyBase -> MyDerived
Затем у меня есть функция, которая будет принимать любой из производных типов как QPointer;
void function(QPointer<MyBase> base) {
...
}
Теперь проблема в том, что я не могу пройти QPointer<MyDerived>
в эту функцию, что я бы сделал, если бы использовал стандартные указатели. Нужно ли приводить этот объект, чтобы он соответствовал функции? Или я должен просто использовать нормальные указатели?
Кроме того, кто-нибудь знает стандартное поведение, когда вы выделяете объект, который дает сбой? Должны ли вы всегда делать это в блоке try или оборачивать его во что-то, чтобы проверить, является ли оно нулевым или нет? Я прочитал документацию по Qt, и они сказали, что большинство их классов возвращали нулевое значение, если его не удалось выделить. Когда это утверждение верно и что я могу сделать, если я не хочу использовать try-catch?
2 ответа
Вы должны использовать обычный указатель. Это то, что Qt Document говорит об использовании QPoiner
"Защищенный указатель будет автоматически приведен к T *, так что вы можете свободно смешивать охраняемые и неохраняемые указатели. Это означает, что если у вас есть QPointer
Как упомянул @Kunal, лучше передать необработанный указатель в вашем случае, но я вижу, что у вас возникают проблемы с владением указателем. Передавать необработанные указатели на методы объекта опасно, потому что, когда ваша кодовая база увеличивается, вы скоро запутаетесь в том, какой объект является владельцем данного конкретного указателя, и это может очень легко привести к утечкам памяти. По этой причине я бы рекомендовал использовать QSharedPointer вместо QPointer или даже необработанный указатель. QSharedPointer поддерживает полиморфизм, так что вы сможете передать его (в качестве значения) любой функции / объекту, который вам нужен, не беспокоясь о владении, потому что QSharedPointer станет владельцем указателя и удалит его, когда все последние экземпляры QSharedPointer уйдут выходит за рамки.