инициализация члена класса c ++ (poco) - PullRequest
1 голос
/ 03 ноября 2011

Я делаю обертку для использования в базе данных, используя 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 ]

3 голосов
/ 03 ноября 2011

Либо сделайте это за пределами 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 голос
/ 03 ноября 2011

Чтобы включить этот тип функций напрямую, вы пишете объект-оболочку в стиле RAII вокруг функции registerConnector:

class wrapper {
public:
    wrapper() {
        Poco::Data::ODBC::Connector::registerConnector();
    }
    ~wrapper() {
        Poco::Data::ODBC::Connector::unregisterConnector();
    }
}

Так что теперь вы можете сделать:Тем не менее, я не думаю, что это хороший дизайн;он оставляет без ответа вопросы:

  1. Почему вы инициализируете базу данных подсистему в оболочке database?Может быть, это должно быть сделано как часть программы инициализации программы?
  2. Что произойдет, если несколько database объектов будут использоваться одновременно?Регистрация / отмена регистрации может вызвать проблемы;выполнение init, как описано выше, не будет.
0 голосов
/ 03 ноября 2011

Похоже, registerConnector - это бесплатная функция.Для вызова других функций в списке инициализации вы можете использовать оператор запятой:

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

Встроенный оператор запятой вычисляет два выражения и возвращает результат второго.

В качестве альтернативы выможет быть в состоянии создать собственный класс, который обрабатывает класс registerConnector(), и поместить его в класс до ses, так что его построение произойдет до того, как ses.

...