Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

dynamic_cast

354
23 апреля 2008 года
ШпиЁн
468 / / 19.02.2006
доброго всем дня :)
Суть проблемы, есть некий шаблонный класс. Если в качестве шаблона задействованы производные лкасса Object, необходимо выполнить над ними какое-то действие. Если T - простой тип или класс не являющийся потомком Object, никаких действий выполнять не надо. У меня ошибка на dynamic_cast...
Может быть можно как-то по-другому это реализовать?
Код:
#include <windows.h>
#include <iostream>
using namespace std;

class Object
{
public:
    Object(){}
    ~Object(){}
};

class Test : public Object
{
public:
    Test(){}
    ~Test(){}
};

template <class T> class myClass
{
public:
    myClass()
    {
        if(Object * obj = dynamic_cast<Object*>(m_data)) // error C2681: 'int *' : invalid expression type for dynamic_cast

        {
            cout << "is instanse of Object " << endl;
        }      
    }
    ~myClass(){}
    T * m_data;
};

int _tmain(int argc, _TCHAR* argv[])
{
    myClass<int> m;
    myClass<Test *> m1;
    return 0;
}
3
23 апреля 2008 года
Green
4.8K / / 20.01.2000
Цитата: ШпиЁн
доброго всем дня :)
Суть проблемы, есть некий шаблонный класс. Если в качестве шаблона задействованы производные лкасса Object, необходимо выполнить над ними какое-то действие. Если T - простой тип или класс не являющийся потомком Object, никаких действий выполнять не надо. У меня ошибка на dynamic_cast...
Может быть можно как-то по-другому это реализовать?


Настоящие программисты C++ никогда не используют dynamic_cast, и уж тем более при работе с шаблонами, и особенно в таких простых случаях, как твой. Они вообще никогда не применяют dynamic_cast. :)

Решение твоей проблемы лежит в паре строк:

Код:
template <class T>
class myClass
{
public:
    myClass() {
        onConstruct(m_data);
    }

    ~myClass() {}

private:
    void onConstruct(Object*) {
        cout << "is instanse of Object " << endl;
    }

    void onConstruct(...) {}

    T* m_data;
};
354
23 апреля 2008 года
ШпиЁн
468 / / 19.02.2006
спасибо :)
но это не совсем то что нужно.
 
Код:
int _tmain(int argc, _TCHAR* argv[])
{
    myClass<int> m;
    myClass<Test *> m1;
    return 0;
}

у меня в любом случае, при создании m и m1 вызывается onConstruct(...)
. дело в том что нужно как-то отличать объекты класса Object( производных от него) от всех других типов шаблона. :)
onConstruct(Object*) не вызывается вообще в этом варианте.
3
23 апреля 2008 года
Green
4.8K / / 20.01.2000
Цитата: ШпиЁн
спасибо :)
но это не совсем то что нужно.
 
Код:
int _tmain(int argc, _TCHAR* argv[])
{
    myClass<int> m;
    myClass<Test *> m1;
    return 0;
}

у меня в любом случае, при создании m и m1 вызывается onConstruct(...)
. дело в том что нужно как-то отличать объекты класса Object( производных от него) от всех других типов шаблона. :)
onConstruct(Object*) не вызывается вообще в этом варианте.


(с) "... Просто, вы их не умеете готовить!"

Вот эта запись: T* m_data;
с учетом вот этой: myClass<Test *> m1;
обозначает, что твое поле m1 будет типа Test**, а не как ты видимо хотел Test*.
Конечно, Test** не может быть приведен к Object* !!!
Поэтому и onConstruct(Object*) не вызывается.

354
23 апреля 2008 года
ШпиЁн
468 / / 19.02.2006
упс! какая глупая ошибка :D
спасибо, все заработало :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог