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

时间:2011-11-03 18:46:16

标签: c++ oop class initialization poco-libraries

我正在使用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

如何在Poco::Data::ODBC::Connector::registerConnector()

的初始化调用之前调用ses

我试过

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

但这不起作用。它给出了错误

'registerConnector' : is not a member of 'Poco::Data::ODBC::Connector'

我应该怎么做?

3 个答案:

答案 0 :(得分:3)

要么在database::database()之外执行,要么使用指向Session而不是成员的指针,并将其分配到构造函数内的堆上。类似的东西:

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

database::~database()
{
    delete ses;
}

答案 1 :(得分:1)

要直接启用此类功能,请在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个对象会怎样?注册/取消注册会导致问题;按上述方式执行init不会。

答案 2 :(得分:0)

看起来registerConnector是一个免费功能。要调用初始化列表中的其他函数,可以使用逗号运算符:

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

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

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