如何使用这样的模板类实例数组,一直想不明白

mopyman 2007-03-12 10:18:32
#include <iostream>
using namespace std;

template<typename T>
class Base
{
public:
void Fun()
{
T* pT = static_cast<T*>(this);
pT->vf();
}

void vf()
{
cout << "Base::vf" << endl;
}
};

class Derived : public Base<Derived>
{
public:
void vf()
{
cout << "Drived:vf" << endl;
}
};
==================================
我想声明一个模板类base的指针数组,用来容纳派生模板类的实例指针,
来实现多态,用普通类实现多态就很简单了,这模板,难
似乎每一个派生类都是一个与不相干的类型,如何声明一个这样的数组并使用它呢,如下这样可以吗?
template<class T> base<T> basearray[10];
然后给数组元素赋派生类指针
感觉这样的话,这个T一致不起来啊
...全文
914 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jim_King_2000 2007-03-12
  • 打赏
  • 举报
回复
不想用MFC可以用SDK或者WTL啊.自己封装API也不是不可以(如果时间和精力允许的话).不过使用模板就没有什么必要了.
mopyman 2007-03-12
  • 打赏
  • 举报
回复
就是不想用MFC嘛,不然也没这些问题了
Jim_King_2000 2007-03-12
  • 打赏
  • 举报
回复
我感觉你的模板类型T用到的地方不是很多.对于这样的程序,使用MFC足矣,无需再去自己封装API,尤其无需使用模板.泛型指针可以使用CDialog *,或者HWND.
todototry 2007-03-12
  • 打赏
  • 举报
回复
mark
mopyman 2007-03-12
  • 打赏
  • 举报
回复
看来这条路行不通了,换思路
mopyman 2007-03-12
  • 打赏
  • 举报
回复

template <class T>
class KDialogBase : public KWnd<T>{
public:
KDialogBase():KWnd(){}
LRESULT DoDefault(UINT uMsg, WPARAM wParam, LPARAM lParam) { return FALSE; }

LRESULT KCALLBACK KWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam){
LRESULT fReturn = KWnd<T>::KWndProc(hWnd,uMsg,wParam,lParam);
if (fReturn!=FALSE){
switch (uMsg){
case WM_COMPAREITEM :
case WM_VKEYTOITEM :
case WM_CHARTOITEM :
case WM_INITDIALOG :
case WM_QUERYDRAGICON :
case WM_CTLCOLORMSGBOX :
case WM_CTLCOLOREDIT :
case WM_CTLCOLORLISTBOX :
case WM_CTLCOLORBTN :
case WM_CTLCOLORDLG :
case WM_CTLCOLORSCROLLBAR :
case WM_CTLCOLORSTATIC :
::SetWindowLongPtr(m_hWnd,DWLP_MSGRESULT,(LONG)fReturn);
fReturn=TRUE;
break;
default:
break;
}
}
return fReturn;
}

INT_PTR DoModal(HWND hWndParent=::GetActiveWindow(),HINSTANCE hInst=(HINSTANCE)::GetModuleHandle(NULL),
LPARAM lpInitParam=NULL){
m_hInst=hInst;
return ::DialogBoxParam (
hInst, MAKEINTRESOURCE(T::IDD),
hWndParent,
(DLGPROC)GetThunkedProcPtr(), lpInitParam);
}

HWND Create(HWND hWndParent,HINSTANCE hInst=::GetModuleHandle(NULL),LPARAM lpInitParam=NULL){
_ASSERT (m_hWnd == NULL);
m_hInst=hInst;
m_hWnd=::CreateDialogParam(hInst,MAKEINTRESOURCE(T::IDD),hWndParent,
(DLGPROC)GetThunkedProcPtr(),lpInitParam);
return m_hWnd;
}
bool EndDialog(int nRetCode){return 0!=::EndDialog(m_hWnd,nRetCode);}
};
Jim_King_2000 2007-03-12
  • 打赏
  • 举报
回复
KDialogBase的定义能不能贴出来看看?
mopyman 2007-03-12
  • 打赏
  • 举报
回复
而且可执行文件的尺寸很小
taodm 2007-03-12
  • 打赏
  • 举报
回复
汗,“效率、性能”,你正在试的种种方法,能有0.1%的影响就算了不起了。
mopyman 2007-03-12
  • 打赏
  • 举报
回复
一部分代码
class KSettingDlg : public KDialogBase<KSettingDlg>{
public:
BEGIN_MSG_MAP(KSettingDlg)
MESSAGE_HANDLER(WM_INITDIALOG,OnInitDialog)
COMMAND_ID_HANDLER(IDCANCEL,OnCancel)
REFLECT_NOTIFICATIONS()
END_MSG_MAP(KDialogBase<KSettingDlg>)

enum{IDD=IDD_SETTING};

LRESULT OnInitDialog(WPARAM wParam,LPARAM lParam,bool& bHandled){
CentralizeWindow();
m_tabCtrl.SubclassDlgItem(IDC_TABCTRL1,*this);
return TRUE;
}
LRESULT OnCancel(WORD wID,WORD wNotifyCode,HWND hWndCtrl,bool& bHandled){
EndDialog(wID);
return 0;
}
private:
KTabCtrlDlg m_tabCtrl;
};
mopyman 2007-03-12
  • 打赏
  • 举报
回复
所以要用这个异质数组,如果不是模板,一切都是那么简单,为了效率、性能,
丧失了部分灵活性,这也算是代价吧
Jim_King_2000 2007-03-12
  • 打赏
  • 举报
回复
我没有听说过模板Dialog啊?lz可不可以贴一段代码解释一下?
Jim_King_2000 2007-03-12
  • 打赏
  • 举报
回复
你的程序需要解决什么样的问题啊?为什么非要让模板数组来实现多态呢?
mopyman 2007-03-12
  • 打赏
  • 举报
回复
因为我在一个模板TabCtrl里要用到很多模板Dialog来充实各个tab标签,
如果一个个枚举就太麻烦了,而且没有通用性,如果解决不了,我就用
HWND数组了
taodm 2007-03-12
  • 打赏
  • 举报
回复
不如换个思路,你为什么要建这个“异质”数组。
mopyman 2007-03-12
  • 打赏
  • 举报
回复
也就是要用一个非模板的公共基类,而且要用virtual方法
sinall 2007-03-12
  • 打赏
  • 举报
回复
回复人:mopyman(only you c plus plus) ( 二级(初级)) 信誉:100 2007-03-12 10:50:01 得分:0
?
真的没办法了???哭
现在也不好改基础架构啊,很大的东西
——————————————————————————————————————————
用我上面的方法,不需要改太多东西吧。
sinall 2007-03-12
  • 打赏
  • 举报
回复
数组当然是不可能的,只有virtual多态才行。

模板实现“多态”也是容易的事啊:
#include <iostream>
using namespace std;

struct PureBase // 还是要把接口给抽象出来
{
virtual void vf() = 0;
};

template<typename T> // 这个类相当于是个Adapter,把具有vf函数的类,适配成符合PureBase的类
class Base : public PureBase
{
public:
Base(T* pt)
: _pt(pt)
{
}
void Fun()
{
_pt->vf();
}

void vf()
{
cout << "Base::vf" << endl;
}
private:
T* _pt;
};

class Derived
{
public:
void vf()
{
cout << "Drived:vf" << endl;
}
};

PureBase* basearray[10];
mopyman 2007-03-12
  • 打赏
  • 举报
回复
真的没办法了???哭
现在也不好改基础架构啊,很大的东西
jixingzhong 2007-03-12
  • 打赏
  • 举报
回复
加载更多回复(12)

64,685

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧