Требуется ли DECLARE_DYNAMIC для абстрактных базовых классов в MFC? - PullRequest
4 голосов
/ 05 января 2012

У меня есть базовый класс, производный от класса MFC CView и шаблонного класса, что-то вроде:

template<class TYPE>
class CMytViewT : public CView,public CMyTemplateClassT<TYPE>
{
DECLARE_DYNCREATE(CMyViewT<TYPE>)

private:
   CMyViewT();
'
'
'
}


IMPLEMENT_DYNCREATE(CMyViewT<TYPE>, CView)

Теперь я предполагаю, что макросы MFC будут расстроены шаблонами,и я рассматриваю возможность удаления макросов динамического создания для этого класса и повторного введения его для каждой специализации шаблона.Например,

template<class TYPE>
class CMytViewT : public CView,public CMyTemplateClassT<TYPE>
{
public:
   CMyViewT();
'
'
'
}

Class CMyView : public CMyViewT<CMyClass>
{
DECLARE_DYNCREATE(CMyView)

private:
   CMyView();
}   

IMPLEMENT_DYNCREATE(CMyView, CView)

Мне интересно, может ли это вызвать проблемы в будущем, как и во всех других реализациях, которые я видел, макросы были включены для всех промежуточных классов.Я не вижу этого, но я что-то пропустил?

Редактировать Посмотрев на ответ Мэтью Холдерса ниже, я нашел следующую статью microsoft connect ,в котором говорится, что поддержка IMPLEMENT_DYNAMIC_T была удалена из-за ошибки.

1 Ответ

3 голосов
/ 05 января 2012

Во-первых, в шаблоне используйте IMPLEMENT_DYNCREATE_T(CMyViewT, {specialization}, CView) для каждой специализации, если вы хотите поддерживать DECLARE_DYNCREATE и удалите <TYPE> из DECLARE_DYNCREATE.

Во-вторых, единственная проблема, с которой вы можете столкнуться, не используя DECLARE_ *, - это использовать макрос MFC DYNAMIC_DOWNCAST для приведения к или из CMyViewT; для которого C ++ dynamic_cast является предпочтительным в любом случае.

Если вы планируете создать шаблон для каждой специализации, вам действительно не нужно указывать DECLARE_DYNCREATE в представлении шаблона, а только в производной.

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