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)。如果逗号运算符是不可能的,有没有办法实现我想要的?

4

1 回答 1

4

尽管这可能只是一种观点,但我建议不要写这种表达方式;你给维护者增加了额外的负担,要在调用实际函数之前弄清楚到底在执行什么;即使弄清楚函数需要多少个参数,也需要付出一些努力,因为在这种情况下,逗号通常只用于分隔参数。

对于单个参数,我会这样做:

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

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

注意我正在返回一个新值。a如果类型太昂贵而无法复制,它甚至可以通过引用获取和返回。

对于多个参数,所有参数都需要一次更新,我会更改基础以接收带有命名实体的整个参数包,或者可能是 a std::tuple,并像单参数版本一样进行操作。

于 2013-10-16T06:58:23.563 回答