c++类成员初始化(poco)

c++ class member initialization (poco)

本文关键字:poco 初始化 成员 c++      更新时间:2023-10-16

我正在使用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"){
     }
};

然而,我不认为这是一个好的设计;它留下了未回答的问题:

  1. 为什么在database包装器中初始化数据库子系统 ?也许它应该作为程序init例程的一部分来完成?
  2. 如果同时使用多个database对象会发生什么?注册/注销会造成问题;

看起来registerConnector是一个自由函数。要调用初始化列表中的其他函数,可以使用逗号操作符:

 database()
    : ses(
        ( Poco::Data::ODBC::Connector::registerConnector(), "ODBC" )
        , "DSN=name;uid=user;pwd=pass"
      )
 {...}

内置逗号运算符对两个表达式求值,并返回第二个表达式的结果。

或者,您可以创建一个处理registerConnector()类的自定义类,并将其放在ses之前的类中,以便它的构造将在ses之前发生。