Нахождение типа объекта в C++

В конце я решил использовать директиву ref Vue . Это позволяет ссылаться на компонент для родителя для прямого доступа.

Например,

Укомплектовать compendent в моем родительском экземпляре:

var vm = new Vue({
    el: '#app',
    components: { 'my-component': myComponent }
});

компонент в шаблоне / html со ссылкой:


Теперь, в другом месте, я могу получить доступ к компоненту извне


См. эту скрипту для примера: https: //jsfiddle.net/xmqgnbu3/1/

(старый пример с использованием Vue 1: https://jsfiddle.net/6v7y6msr/ )

133
задан lemnisca 9 December 2008 в 05:06
поделиться

7 ответов

dynamic_cast должен добиться цели

TYPE& dynamic_cast<TYPE&> (object);
TYPE* dynamic_cast<TYPE*> (object);

dynamic_cast , ключевое слово бросает данную величину от одного типа указателя или ссылочного типа другому, выполняя проверку на этапе выполнения для обеспечения законности броска.

, При попытке бросить к указателю на тип, который не является типом фактического объекта, результат броска будет ПУСТЫМ. При попытке бросить к ссылке на тип, который не является типом фактического объекта, то бросок бросит bad_cast исключение.

Удостоверяются, что существует по крайней мере одна виртуальная функция в Базовом классе, чтобы заставить dynamic_cast работать.

150
ответ дан 23 November 2019 в 23:53
поделиться

Это называют RTTI, но Вы почти наверняка хотите пересмотреть свой дизайн здесь, потому что нахождение типа и выполнение специальных вещей на основе его делают Ваш код более хрупким.

24
ответ дан 23 November 2019 в 23:53
поделиться

Вероятно, встройте в свои объекты идентификатор "тег" и используйте его для различения объекты класса A и объекты класса B.

Это однако показывает дефект в дизайне. Идеально те методы в B, который не имеет A, должны быть частью A, но оставленный пустой, и B перезаписывает их. Это покончило с определенным для класса кодом и находится больше в духе ООП.

9
ответ дан 23 November 2019 в 23:53
поделиться

Вы ищете dynamic_cast<B*>(pointer)

7
ответ дан 23 November 2019 в 23:53
поделиться

Поскольку другие указали, что можно использовать dynamic_cast. Но обычно с помощью dynamic_cast для обнаружения типа производного класса Вы работаете на, указывает на плохой дизайн. При переопределении функции, которая берет указатель как параметр затем, это должно смочь работать с методами/данными самого класса A и не должно зависеть от данные класса B. В Вашем случае вместо того, чтобы переопределить, если Вы уверены, что метод пишете, будет работать только с классом B, затем необходимо записать новый метод в классе B.

3
ответ дан 23 November 2019 в 23:53
поделиться

Ваше описание немного сбивает с толку.

Вообще говоря, хотя некоторые реализации C++ имеют механизмы для него, Вы, как предполагается, не спрашиваете о типе. Вместо этого Вы, как предполагается, делаете dynamic_cast на указателе на A. То, что это сделает, - то, что во времени выполнения, фактическое содержание указателя на A будет проверено. Если у Вас будет B, то Вы получите свой указатель на B. Иначе Вы получите исключение или пустой указатель.

2
ответ дан 23 November 2019 в 23:53
поделиться

Используйте перегруженные функции. Не требует dynamic_cast или даже поддержки RTTI:

class A {};
class B : public A {};

class Foo {
public:
    void Bar(A& a) {
        // do something
    }
    void Bar(B& b) {
        Bar(static_cast<A&>(b));
        // do B specific stuff
    }
};
1
ответ дан 23 November 2019 в 23:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: