Условный вызов базового конструктора - PullRequest
0 голосов
/ 12 июня 2018

В настоящее время у меня есть базовый класс с двумя разными конструкторами:

class Base {
public:
   Base(std::string filname){...}
   Base(int a, int b) {...}
};

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

class Derived : public Base {
public:
    Derived() {
        if( /* exists("myFile") */ )
            this->Base("myFile");
        else
            this->Base(1,2);
    }
}

Возможно ли это сделать? Или поскольку базовый класс инициализируется перед производным классом, единственный способ вызвать базовый конструктор - это список инициализатора?

Спасибо

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Вы можете смоделировать это, введя заводскую функцию:

class Base {
public:
    Base(std::string filname);
    Base(int a, int b);
};

class Derived : public Base {
    Derived(std::string filname) : Base(filname) {}
    Derived(int a, int b) : Base(a, b) {}
public:
    static Derived create() {
        if( /* exists("myFile") */ )
            return Derived("myFile");
        else
            return Derived(1,2);
    }
};

int main(){
    auto d = Derived::create();
}

В качестве альтернативы, если не требуется деривация из Base, экземпляр Base может быть сохранен как член (std::unique_ptr или std::aligned_storage), которые вы можете инициализировать по своему усмотрению.

0 голосов
/ 12 июня 2018

Выбор того, какой базовый конструктор вызывается, происходит перед телом функции, и нет способа изменить его во время выполнения подобным образом.Тем не менее, вы можете быть ближе.Если в базовом классе также есть конструктор перемещения или вы можете добавить его, вы можете использовать его:

class Derived : public Base {
public:
    Derived()
        : Base{ exists("myFile") ? Base{"myFile"} : Base{1, 2} } {
    }
}

Это вызовет exists("myFile");если он возвращает true, он создаст временный Base с использованием первого конструктора, а если он вернет false, он создаст временный Base с использованием второго конструктора.В любом случае, он затем создаст фактический базовый подобъект, используя этот временный.

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