2017-03-09 46 views
0

给定一个头文件具有不同的函数(函数1和函数2):共享相同默认参数的最佳实践是什么?最佳实践C++:重复使用多个方法的默认参数

class MyClass { 
    public: 
     virtual ... function1(..., int param1 = 48, int param2 = getStuff(99)) = 0; 
     virtual ... function2(..., int param1 = 48, int param2 = getStuff(99)) = 0; 
} 

使用类似

#define PARAM1 = 48 
#define PARAM2 = getStuff(99) 

似乎相当不方便。我对C++相当陌生,所以我不知道在这种情况下最好的做法是什么。我应该在MyClass中创建一些私有常量吗?

+0

使用成员变量而不是参数? – felix

+0

使用定义我没有看到任何错误。只要你给定义一个有意义的名字。例如NUMBER_OF_SECONDS_IN_A_DAY。 – wmc

+0

关于成员变量:这似乎是一个合理的方法,但是,我也有一些默认参数,这些参数是由某些函数设置的,我不想存储返回值,但每次函数调用时都要调用它。 – juq

回答

1

你可以这样做:

class MyClass { 
public: 
    void function1(int param1 = default_param1, int param2 = default_param2()); 
    void function2(int param1 = default_param1, int param2 = default_param2()); 

private: 
    static const int default_param1 = 48; 
    static int default_param2() { return getStuff(99); } // assuming it might change 
}; 
1

我看到你的函数是虚拟的 - 要知道,默认参数是不能继承的!

int getStuff(int n) 
{ 
    return n; 
} 

class MyClass 
{ 
public: 
    static constexpr int DefaultParam1 = 48; 
    static constexpr int DefaultParam2 = 99; 

    virtual ~MyClass() = default; 

    virtual void function1(int param1 = DefaultParam1, int param2 = DefaultParam2) = 0; 

    inline void function2() 
    { 
     function1(getStuff(DefaultParam1), getStuff(DefaultParam2)); 
    } 
    inline void function2(int param1) 
    { 
     function1(param1, getStuff(DefaultParam2)); 
    } 
    virtual void function2(int param1, int param2) = 0; 
}; 

在我的例子看看函数2,它有过多的内联函数。优势:

class MC : public MyClass 
{ 
public: 
    virtual void function1(int param1, int param2) 
    { 
    } 
    using MyClass::function2; 
    virtual void function2(int param1, int param2) 
    { 
    } 
}; 

int main() 
{ 
    MC mc; 
    ((MyClass&)mc).function1(); 
    mc.function2(); 
    return 0; 
} 

function1需要投与缺省参数使用(而不在继承类重犯),function2不(不幸的是,你需要使用子句,使重载可见的继承类,虽然)。

附注:我没有说第一种方法是错误的或坏,我只是出一个替代...