C ++ Подклассы, Наследование и Кастинг - PullRequest
2 голосов
/ 09 февраля 2011

Мне сложно объяснить эту конкретную головоломку, поэтому я постараюсь изо всех сил.

В платформе Qt есть 2 класса: QTreeWidget и QTreeWidgetitem.

Я вложил в подкласс QTreeWidgetitem:


class MyQTreeWidgetitem : public QObject, public QTreeWidgetitem
{

...

public:
  int myCustomVariable;
}

Я добавляю это в QTreeWidget, делая что-то вроде:


MyQTreeWidgetitem *item = new MyQTreeWidgetitem;
item->myCustomVariable = 10;

tree->addTopLevelItem(item);

Теперь, если мне когда-нибудь понадобится вызвать tree-> topLevelItem (x), все, что я получу, это QTreeWidgetitem *.

Однако, что мне нужно, так это MyQTreeWidgetitem *, поэтому я:


MyQTreeWidgetItem *theitem = (MyQTreeWidgetItem*)tree->topLevelItem(n);

Проблема в том, что theitem-> myCustomVariable больше не равен 10.

Есть ли способ сохранить MyQTreeWidgetitem без изменений?

Ответы [ 2 ]

3 голосов
/ 09 февраля 2011

Я не знаю Qq, но вы можете попробовать сделать правильный dynamic_cast<>, который проверит, действительно ли объект является MyQTreeWidgetItem* (в противном случае возвращает 0), а также правильно выполнит преобразование указателя (яне уверен, что приведение в стиле C возвращает адрес QObject).Вы можете распечатать указатели и получить более полное представление об этой проблеме.

2 голосов
/ 09 февраля 2011

Использование приведения в стиле C в программе на C ++ обычно является плохой идеей.Может быть хорошо использовать его для примитивных типов, но его следует избегать для классов.Хотя в данном конкретном случае это может быть хорошо, однажды вы окажетесь в глубокой беде из-за этого.

Использование dynamic_cast<>, вероятно, хорошо.Поскольку вы не используете виртуальное наследование, вы также можете использовать static_cast<>, у него есть преимущество, заключающееся в том, что он не требует RTTI (некоторые платформы могут плохо поддерживать его) и немного быстрее.Я также слышал, что dynamic_cast иногда не работает должным образом через границы разделяемой библиотеки.

Для даункастинга между подклассами QObject также есть qobject_cast<> доступный в Qt.Это не поможет вам в этом случае, так как QTreeWidgetItem не является подклассом QObject, но может помочь вам в других местах, где вам нужно привести из QObject * в MyQTreeWidgetItem *.Он также используется для приведения к интерфейсам, если вы используете механизм подключаемых модулей Qt.

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