используйте оператор запятой для инициализации базового класса

0

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

Скажем, у меня есть следующие базовые и производные классы:

class Base
{
    protected:
        int i;
        int j;
    public:
        Base(int a):i(a),j(a){}
        Base(int a, int b):i(a),j(b){}
};

class Derived:public Base
{
    private:
        int d;
        void inc(int & a) {a++;}
        void inc(int & a, int & b) {a++; b++;}
    public:
        Derived(int a, int b, int c); 
};

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

Derived::Derived(int a, int b, int c):Base((inc(a),a)),d(c){}

Теперь, если я хочу предварительно обработать два параметра и использовать их для инициализации базы? Я сделал следующее:

Derived::Derived(int a, int b, int c):Base((inc(a,b),(a,b))),d(c){}

Но это не то, что я хочу, потому что однопараметрический базовый конструктор будет по-прежнему использоваться (поскольку (a,b) также является оператором запятой, который возвращает b). Есть ли способ достичь того, чего я хочу, если запятая не возможна?

Теги:

1 ответ

4
Лучший ответ

Хотя это может представлять собой просто мнение, я бы рекомендовал не писать такие выражения; вы ставите дополнительную нагрузку на сопровождающего, чтобы выяснить, что именно выполняется до того, как будет вызвана действительная функция; даже вычисляя количество аргументов, которые выполняет функция, потребует определенных усилий, поскольку в этом контексте запятые обычно используются только для разделения аргументов.

Для одного аргумента я бы сделал это следующим образом:

class Derived : Base {
    static int computeSomething(int a) { return a+1; }

    Derived(int a) :
        Base(computeSomething(a)), ...
    { ... }
};

Примечание. Я возвращаю новое значение. Он может даже взять и вернуть по ссылке, если тип a слишком дорог для копирования.

Для нескольких аргументов все, что нужно было обновить сразу, я бы изменил базу, чтобы получить весь пакет аргументов с именованным объектом или, может быть, std::tuple, и сделать это как версию с одним аргументом.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню