结构体里是不是不能定义函数
答:
c中不能(可以采用函数指针的方式),c++里可以在结构体内定义函数,用法和class定义类是一样的(说明:C++里为了凸显面向对象的特性,故意将结构体淡化了,对于一些小工程,C++里使用结构体编程反倒有优势),
说穿了struct 和 class用法相同(C++里的结构体非常好用,直接在内部用函数对相应的变量初始化,但要在调用时才会触发初始化),
但要注意的一点是,struct默认的是public类型,而class默认的是private类型的。
注:在C++里,结构体与类几乎等同
C的例子:
typedef void (*pFunsm_run)(unsigned char sm_id, unsigned char dir, unsigned int max_speed, unsigned long Distense);
typedef void (*pFunsm_stop)(unsigned char sm_id);
typedef void (*pFunsm_sreak)(unsigned char sm_id);
typedef void (*pFunsm_set_enable)(unsigned char sm_id, bool enable_flag);
typedef struct _stOpCtrl
{
unsigned char mEn; // 功能动作允许
...
pFunsm_stop stop_sm;
pFunsm_run run_sm;
pFunsm_sreak break_sm;
pFunsm_set_enable set_enable_sm;
} stOpCtrl;
stOpCtrl opration;
opration. stop_sm = sm_stop;
opration. run_sm = sm_run;
opration. break_sm = sm_break;
opration. set_enable_sm= sm_ set_enable;
接下来就可以用函数指针调用了(参数我就不写了)
opration. stop_sm();
opration. run_sm();
opration. break_sm();
opration. set_enable_sm();
C++例子:
typedef struct _GLOBAL_OBJECT{
/*成员变量*/
CDialog* mDlg;
BOOL IsToReset; //是否需要复位
BOOL IsResetOK; //是否复位完成
...
_GLOBAL_OBJECT() //构造函数
{
mDlg =NULL;
IsToReset =FALSE;
IsResetOK =FALSE;
...
}
~_GLOBAL_OBJECT() //析构函数
{
//OutputDebugString("%%%%%%%%%%%%%%%%%%%%%%%%%%");
for (int i=0; i<nMaxCardNub;i++)
{
if(NULL != m_pCard[i])
delete m_pCard[i];
m_pCard[i]=NULL;
}
//OutputDebugString("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$");
delete pBufForRecvCmd;
pBufForRecvCmd =NULL;
}
CString IniFile(){//成员函数
CString strIniFile;
strIniFile.Format("%s",cIniFile);
return strIniFile;
};
CardObj* GetCardObject() //成员函数
{
for (int i=0;i<nMaxCardNub;i++)
{
if(!m_pCard[i]->IsUse)
{
m_pCard[i]->IsUse=TRUE;
return m_pCard[i];
}
}
return NULL;
}
void ReleaseCardObject(CardObj* pCardObj) //成员函数
{
pCardObj->Init();
}
}GLOBAL_OBJECT,*PGLOBAL_OBJECT;