Необходимо вызвать метод на члене перед вызовом базового класса - PullRequest
1 голос
/ 19 сентября 2019

У меня есть код, подобный следующему:

template<class BASE_TYPE = COdbcQuery>
class CRemoteQuery : public BASE_TYPE
{
    CRemoteDatabase m_Db;

public:
    CRemoteQuery()
        : BASE_TYPE(&m_Db)
    {
    }

    ~CRemoteQuery()
    {
    }
};

Моя проблема в том, что m_Db.Open() должен быть вызван перед передачей m_Db в базовый конструктор.

Если я вызываюметод в качестве аргумента базового конструктора, который вызывает Open(), он завершается ошибкой, поскольку m_Db еще не был инициализирован.

Я попытался создать виртуальный метод в базовом классе, который будет вызываться во время инициализации, иэтот класс может переопределять, но классы шаблонов не могут переопределять виртуальные методы.

Реструктуризация моих базовых классов, так что m_Db не нужно открывать сначала, вызывает много трудных проблем.Нет ли способа сделать это?

1 Ответ

2 голосов
/ 19 сентября 2019

Эту последовательность событий можно легко реализовать, внеся небольшое изменение в проект:

class CRemoteDB {

protected:
    CRemoteDatabase m_Db;

    CRemoteDB()
    {
          m_Db.open();
    }
};

template<class BASE_TYPE = COdbcQuery>
class CRemoteQuery : private CRemoteDB, public BASE_TYPE
{

public:
    CRemoteQuery()
        : BASE_TYPE(&m_Db)
    {
    }

    ~CRemoteQuery()
    {
    }
};

Родительские классы всегда создаются в порядке объявления.Сначала создается родительский класс CRemoteDB, а в конструкторе родительского класса вызывается CRemoteDatabase::open().

Затем конструируется BASE_TYPE и получает указатель на открытый m_Db.

CRemoteQuery может обращаться к m_Db из своего родительского класса не иначе, как если бы он был его собственным членом класса.

, но классы шаблонов не могут переопределять виртуальные методы.

PS Тот, кто сказал вам, что был неправ.Шаблонные классы, безусловно, могут переопределять виртуальные методы.У меня здесь огромная иерархия шаблонов, все переопределяющие виртуальные методы их родительских классов, левый и правый.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...