可以将 MFC 模板库 class 与 DECLARE_DYNAMIC() 一起使用吗?
Can use MFC template base class with DECLARE_DYNAMIC()?
我的应用程序中有几个视图,它们几乎相同,所以我决定创建一个 CBaseView class 并且不复制代码。所以我有这样的东西:
template <class BASE_T, class BASE_DOC, class BASE_DLG>
class CBaseView : public CListView
{
DECLARE_DYNCREATE(CBaseView<BASE_T, BASE_DOC, BASE_DLG>)
void func1()
{
// GetData() is just another method in CBaseView
BASE_T oData = GetData();
...
}
void func2()
{
BASE_DOC* pDocument = (BASE_DOC*) CView::GetDocumet();
pDocument->DoSomething();
...
}
void func3()
{
...
BASE_DLG oBaseDlg();
oBaseDlg.DoModal();
...
}
}
IMPLEMENT_DYNCREATE(CBaseView<BASE_T, BASE_DOC, BASE_DLG>, CListView)
之后我想将 CBaseView 用于其他视图:
CMyView : public CBaseView <MyType, MyDocument, MyDlg> {...};
问题来自:
DECLARE_DYNCREATE(CBaseView<BASE_T, BASE_DOC, BASE_DLG>)
和
IMPLEMENT_DYNCREATE(CBaseView<BASE_T, BASE_DOC, BASE_DLG>, CListView)
它给了我一些奇怪的错误。我看到我不能将此宏与模板 class 一起使用。还找到了一个 similar topic,但我在 MFC 方面(和所有编程方面一样)很新,我无法重写它以适用于我的三个模板参数。
我很担心我想尽了办法还是没有做到。我真的需要找到一种方法或至少一种替代方法,所以请大家帮助我!
我不懂MFC,但问题很明显:宏不接受模板实例化。这是可以理解的,因为首先扩展宏,一旦实例化模板,您将不会有 CBaseView<BASE_T, BASE_DOC, BASE_DLG>
,而是类似 CBaseView<Foo,FooDoc,FooDlG>
的东西,即参数的具体类型。
DECLARE_DYNCREATE
是为了在运行时动态创建实例,而模板只存在于编译时,所以在某些时候你需要决定你想在运行时使用的模板实例化.您可以将实现保留在模板中,但对于与您使用的框架一起使用的类型:
class View1 : public CBaseView<Foo1,FooDoc1,FooDlg1> {
DECLARE_DYNCREATE(View1)
};
IMPLEMENT_DYNCREATE(View1,CListView)
class View2 : public CBaseView<Foo2,FooDoc2,FooDlg2> {
DECLARE_DYNCREATE(View2)
};
IMPLEMENT_DYNCREATE(View2,CListView)
我的应用程序中有几个视图,它们几乎相同,所以我决定创建一个 CBaseView class 并且不复制代码。所以我有这样的东西:
template <class BASE_T, class BASE_DOC, class BASE_DLG>
class CBaseView : public CListView
{
DECLARE_DYNCREATE(CBaseView<BASE_T, BASE_DOC, BASE_DLG>)
void func1()
{
// GetData() is just another method in CBaseView
BASE_T oData = GetData();
...
}
void func2()
{
BASE_DOC* pDocument = (BASE_DOC*) CView::GetDocumet();
pDocument->DoSomething();
...
}
void func3()
{
...
BASE_DLG oBaseDlg();
oBaseDlg.DoModal();
...
}
}
IMPLEMENT_DYNCREATE(CBaseView<BASE_T, BASE_DOC, BASE_DLG>, CListView)
之后我想将 CBaseView 用于其他视图:
CMyView : public CBaseView <MyType, MyDocument, MyDlg> {...};
问题来自:
DECLARE_DYNCREATE(CBaseView<BASE_T, BASE_DOC, BASE_DLG>)
和
IMPLEMENT_DYNCREATE(CBaseView<BASE_T, BASE_DOC, BASE_DLG>, CListView)
它给了我一些奇怪的错误。我看到我不能将此宏与模板 class 一起使用。还找到了一个 similar topic,但我在 MFC 方面(和所有编程方面一样)很新,我无法重写它以适用于我的三个模板参数。
我很担心我想尽了办法还是没有做到。我真的需要找到一种方法或至少一种替代方法,所以请大家帮助我!
我不懂MFC,但问题很明显:宏不接受模板实例化。这是可以理解的,因为首先扩展宏,一旦实例化模板,您将不会有 CBaseView<BASE_T, BASE_DOC, BASE_DLG>
,而是类似 CBaseView<Foo,FooDoc,FooDlG>
的东西,即参数的具体类型。
DECLARE_DYNCREATE
是为了在运行时动态创建实例,而模板只存在于编译时,所以在某些时候你需要决定你想在运行时使用的模板实例化.您可以将实现保留在模板中,但对于与您使用的框架一起使用的类型:
class View1 : public CBaseView<Foo1,FooDoc1,FooDlg1> {
DECLARE_DYNCREATE(View1)
};
IMPLEMENT_DYNCREATE(View1,CListView)
class View2 : public CBaseView<Foo2,FooDoc2,FooDlg2> {
DECLARE_DYNCREATE(View2)
};
IMPLEMENT_DYNCREATE(View2,CListView)