2012-03-16 3 views
1

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

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

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

QObject -> MyBase -> MyDerived

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

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

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

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

ответ

5

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

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

+0

О, я пропустил эту часть! благодарю вас за это – chikuba

+0

, но как я могу в функции защитить себя от указателей поворота/ – chikuba

+0

, что функция не имеет указателя справа? кому-то это принадлежит, поэтому его не нужно удалять, я что-то упускаю? – Kunal

0

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