c++类成员初始化(poco)
c++ class member initialization (poco)
我正在使用Poco:: database::ODBC为我的数据库制作包装器
正常代码应该是这样的:
Poco::Data::ODBC::Connector::registerConnector();
Session ses("ODBC", "DSN=mytest;Uid=mytest;Pwd=mytest");
bool bConnected = ses.isConnected();
Statement select(ses);
select << "SELECT firstname FROM Patients", range(0, 10);
RecordSet rs(select);
while (!select.done())
{
select.execute();
bool more = rs.moveFirst();
while (more)
{
for (std::size_t col = 0; col < rs.columnCount(); ++col)
{
std::cout << rs[col].convert<std::string>() << " ";
}
std::cout << std::endl;
more = rs.moveNext();
}
}
Poco::Data::ODBC::Connector::unregisterConnector();
运行正常
现在对于我的类class database{
Session ses; //Since this is needed all for all the queries.
public:
database():ses("ODBC", "DSN=name;uid=user;pwd=pass"){
}
};//end class
如何在初始化ses
之前调用Poco::Data::ODBC::Connector::registerConnector()
我试着
database():Poco::Data::ODBC::Connector::registerConnector(),ses("ODBC", "DSN=name;uid=user;pwd=pass"){
}
但这不起作用。它给出错误
'registerConnector' : is not a member of 'Poco::Data::ODBC::Connector'
我该怎么做??
要么在database::database()
外部执行,要么使用指向Session
的指针而不是成员,并在构造函数内部的堆上分配它。比如:
database::database()
{
Poco::Data::ODBC::Connector::registerConnector();
ses = new Session("ODBC", "DSN=name;uid=user;pwd=pass");
}
database::~database()
{
delete ses;
}
要直接启用这种功能,您可以在registerConnector
函数周围编写一个raii风格的包装器对象:
class wrapper {
public:
wrapper() {
Poco::Data::ODBC::Connector::registerConnector();
}
~wrapper() {
Poco::Data::ODBC::Connector::unregisterConnector();
}
}
现在你可以这样写:
class database{
Wrapper wrap;
Session ses; //Since this is needed all for all the queries.
public:
database() : wrap(), ses("ODBC", "DSN=name;uid=user;pwd=pass"){
}
};
然而,我不认为这是一个好的设计;它留下了未回答的问题:
- 为什么在
database
包装器中初始化数据库子系统 ?也许它应该作为程序init例程的一部分来完成? - 如果同时使用多个
database
对象会发生什么?注册/注销会造成问题;
看起来registerConnector
是一个自由函数。要调用初始化列表中的其他函数,可以使用逗号操作符:
database()
: ses(
( Poco::Data::ODBC::Connector::registerConnector(), "ODBC" )
, "DSN=name;uid=user;pwd=pass"
)
{...}
内置逗号运算符对两个表达式求值,并返回第二个表达式的结果。
或者,您可以创建一个处理registerConnector()
类的自定义类,并将其放在ses
之前的类中,以便它的构造将在ses
之前发生。
相关文章:
- 是否可以初始化不可复制类型的成员变量(或基类)
- C++使用整数的压缩数组初始化对象
- C++初始化基类
- 多成员Constexpr结构初始化
- 复制列表初始化的隐式转换的等级是多少
- 内联映射初始化的动态atexit析构函数崩溃
- 如何在C++中初始化嵌套类中的2个memeber
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 没有用于初始化C++中的变量模板的匹配构造函数
- 在未初始化映射的情况下,将值插入到映射的映射中
- C++成员初始化
- 为什么在C++中首先初始化成员类
- 同时具有"聚合初始化"和"模板推导"
- 初始化具有非默认构造函数的std::数组项的更好方法
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 在C和C++中初始化结构中的数组
- 标准是否使用多余的大括号(例如 T{{{10}}})定义列表初始化?
- 在函数内部的声明中初始化数组,并在外部使用它
- c++类成员初始化(poco)