Вызов конструктора базового класса после конструктора-члена - PullRequest
0 голосов
/ 10 сентября 2018

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

class Member
{
public:
    Member(int v);  
};

class Base
{
public:
    Base(const Member& m);  
};

class Derived : public Base
{
public:
    Derived() : m_(123), Base(m_) // <- here is the problem
    {
    }

private:
    Member m_;
};

Однако проблема в том, что в конструкторе Derived конструктор Base вызывается первым, когда переменная-член Derived m_, от которой она зависит, еще не инициализирована.

Есть ли способ заставить компилятор сначала вызвать конструктор m_ или мне просто переделать иерархию классов?

1 Ответ

0 голосов
/ 10 сентября 2018

Вы можете смоделировать инициализацию вашего члена перед базовым классом, сделав его собственным базовым классом, который вы инициализируете первым.Вы можете обернуть его в простой тип класса, и Derived может наследовать его от этого типа до Base.В следующем примере Derived имеет Member _m;, который инициализируется и затем используется для инициализации Base.

class Member
{
public:
    Member(int) {}
};

class Base
{
public:
    Base(const Member&) {}
};

// The new wrapper
struct member_wrapper
{
    member_wrapper(int v) : m_(v) {}

    Member m_;
};


class Derived : private member_wrapper, public Base
{
public:
    Derived() : member_wrapper(123), Base(m_)
    { }
};

Хотя в этом случае, поскольку m_ уже является типом classи у Derived нет других членов с этим типом, вы можете просто наследовать напрямую от Member.Если у вас был не class тип или несколько членов одного типа, которые нужно было инициализировать до Base, вам нужно было бы обернуть их.

class Member
{
public:
    Member(int) {}
};

class Base
{
public:
    Base(const Member&) {}
};

class Derived : private Member, public Base
{
public:
    Derived() : Member(123), Base(*this)
    { }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...