C++ C+中的混搭类+/MFC(第二部分)

C++ C+中的混搭类+/MFC(第二部分),c++,templates,mfc,C++,Templates,Mfc,我昨天谈到了重新考虑因素,我所采用的方法显然是错误的。我研究了建议的模式,但问题仍然是,通用功能实际上是一个超级类的东西,我无法从中派生,因为MFC对不同的窗口(CWnd/CDialogEx)提出了自己的要求 今天我有了一个想法,那就是,我可以使用超类模板来打包公共逻辑,从理论上解决这个问题 也就是说,我定义了模板化的CCommon类,并在所有窗口类中用所需的超类继承它。像class-CMyWnd:privateCommon 不幸的是,MFC使事情变得非常丑陋,因为宏 #pragma once

我昨天谈到了重新考虑因素,我所采用的方法显然是错误的。我研究了建议的模式,但问题仍然是,通用功能实际上是一个超级类的东西,我无法从中派生,因为MFC对不同的窗口(CWnd/CDialogEx)提出了自己的要求

今天我有了一个想法,那就是,我可以使用超类模板来打包公共逻辑,从理论上解决这个问题

也就是说,我定义了模板化的CCommon类,并在所有窗口类中用所需的超类继承它。像
class-CMyWnd:privateCommon

不幸的是,MFC使事情变得非常丑陋,因为宏

#pragma once

template <class T> class CCommon : public T
{
    //DECLARE_DYNAMIC(CCommon)

public:
    CCommon();
    virtual ~CCommon();

//protected:
    //DECLARE_MESSAGE_MAP()
};


//IMPLEMENT_DYNAMIC(template <class T> CCommon<T>, CWnd)

template <class T> CCommon<T>::CCommon()
{

}

template <class T> CCommon<T>::~CCommon()
{
}


//BEGIN_MESSAGE_MAP(template <class T> CCommon<T>, CWnd)
//END_MESSAGE_MAP()
#pragma一次
模板类CCommon:public T
{
//声明动态(CCommon)
公众:
CCommon();
虚拟~CCommon();
//受保护:
//声明消息映射()
};
//实现动态(模板CCommon、CWnd)
模板CCommon::CCommon()
{
}
模板CCommon::~CCommon()
{
}
//开始消息映射(模板CCommon,CWnd)
//结束消息映射()
有没有办法解决这个问题


IMPLEMENT\u DYNAMIC(template CCommonWndLogic,T)
template IMPLEMENT\u DYNAMIC(CCommonWndLogic,T)
这样的东西似乎根本无法编译。消息映射也是如此,我真的希望将其保留到基类。

不幸的是,您在使用这种方法时遇到了麻烦。MFC充斥着黑客和遗留解决方案。除非您可以在源代码级别使用MFC,否则您的方法并不实用。你真的不能。严格使用MFC作为API,以便根据需要调用。在你自己的独立类层次中,尽你所能的去做C++软件工程,只需调用MFC就可以实现你的UI的细节。考虑一下ATL/WTL,因为它们是相似的,没有所有向后兼容的错误、丑陋的易断宏和糟糕的套接字代码。你可以在这里找到ATL/WTL链接:它们倾向于在MS站点上移动。不幸的是,我必须重新考虑现有的代码库,并且重写超出了范围:(WTL看起来很不错。我找到了开始模板消息映射(类,键入名称,基类)宏,它现在与消息映射一起编译,不幸的是,似乎没有实现动态的替代方案,如果派生类本身就有实现动态,我可以跳过它吗?@Coder,对不起,我希望我能回答你具体的详细问题。我不能。经验,包括MFC的许多痛苦经验告诉我这一点你的方法是不切实际的,因为它会让你永远陷入奇怪的宏和其他碎片的海洋中。使用MFC的最佳方式是保守地使用它,将其作为API而不是框架,并以其设计者的方式使用(!?@#)做好准备。如果您没有其他选择,我祝您好运。我希望您提出的任何方法都能与任何维护方法兼容MS将在未来应用。+1对于这一点。你可能最终会得到一些东西来工作,但你在每一步都在与体系结构抗争。你知道MFC有多古老吗?模板对它来说是陌生的;看在上帝的份上,他们不得不自己动手尝试。