今天在封装DTL函数的时候,遇到了这个错误: error: argument of type ‘void (EH_Database::)(ParamObjExample&)’ does not match ‘void (*)()’ 也就是我的成员函数,与普通的调用函数指针不匹配。
封装一个delete函数,目的是提供字符串在数据库中查找删除。而字符串,需要用
SetParamsExample(ParamObjExample& params);
函数对参数进行设置,并进行关联。
最初的解决方案为,将SetParamsExample()函数设置为全局函数,类中添加静态静态成员:
static string m_strDelete;
并初始化为空字符串:
string EH_Database::m_strDelete="";
设置参数过程改为如下:
void EH_Database::SetParamsExample(ParamObjExample& params) {
// set parameter values
params.lowIntValue = INT_MAX;
params.highIntValue = INT_MAX;
params.strValue = EH_Database::m_strDelete;
}
最初的考虑是,如果设置参数,不需要定义个类对象,于是用了static方法。成功实现参数传递
然后将函数SetPararamsExample封装到类中,并去掉静态成员,在构造函数中初始化m_strDelete为空,Set中语句为:
params.strValue = m_strDelete;
得到错误如题,C++的普通函数指针没发直接调用类成员函数,怎搞?
http://stackoverflow.com/questions/4017414/argument-of-type-fooint-int-does-not-match-void-int-int-in-main-cp 提到可以将函数设置为static,试之,成功。
成品如下:
类中:
public:
static void SetParamsExample(ParamObjExample& params);
static string m_strDelete;
set函数中
void EH_Database::SetParamsExample(ParamObjExample& params) {
params.lowIntValue = 2;
params.highIntValue = INT_MAX;
params.strValue = m_strDelete;
}
初始化成员:
string EH_Database::m_strDelete="";
delete函数中:
void Delete(string toDelete, string table = "example");
//以上为.h声明,提供默认参数
void EH_Database::Delete(string toDelete, string table) {
m_strDelete = toDelete;
typedef DBView<Example, ParamObjExample> DBV;
DBV view(table, BCAExample(),
"WHERE INT_VALUE BETWEEN (?) AND (?) OR "
"STRING_VALUE = (?) ORDER BY INT_VALUE",
BPAExampleObj());
IndexedDBView<DBV> indexed_view(
view,
"UNIQUE PrimaryIndex; STRING_VALUE; "
"AlternateIndex; INT_VALUE",
BOUND,
USE_ALL_FIELDS,
cb_ptr_fun(SetParamsExample));
IndexedDBView<DBV>::iterator idxview_it = indexed_view.begin();
IndexedDBView<DBV>::iterator deleteMe = idxview_it;
idxview_it++;
indexed_view.erase(deleteMe);
}
感觉上,加上static后,用起来还是和全局函数类似,只是放到了类里面而已,而静态函数又只能掉静态成员,所以如同下面网址
http://bbs.chinaunix.net/thread-967788-1-1.html13楼的说法:静态函数一般也就是用在封装一些常用的、通用的、与类相关但又与实例无关的成员函数。
http://wenku.baidu.com/view/65f1b31e650e52ea551898b4.html这个总结也还不错,就是稍贵,看看也还行。
OK,写了个类,封装了插入删除,今天的成果,菜鸟go go go ~~~