QPointer, содержащий производный объект, не будет совпадать с базовым классом - PullRequest
1 голос
/ 16 марта 2012

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

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

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

QObject -> MyBase -> MyDerived

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

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

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

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

Ответы [ 2 ]

5 голосов
/ 16 марта 2012

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

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

0 голосов
/ 17 марта 2012

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

...