【问题标题】:Best practice C++: Reuse default arguments for multiple methods [closed]最佳实践 C++:为多个方法重用默认参数 [关闭]
【发布时间】:2017-03-09 14:49:38
【问题描述】:

给定一个具有不同函数(function1 和 function2)的头文件:共享相同默认参数的最佳做法是什么?

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 中创建一些私有常量吗?

【问题讨论】:

  • 使用成员变量代替参数?
  • 我认为使用定义没有任何问题。只要您给定义一个有意义的名称。例如NUMBER_OF_SECONDS_IN_A_DAY。
  • 关于成员变量:这似乎是一种合理的方法,但是,我也有一些由我不想存储返回值但我想调用每个函数设置的默认参数调用函数的时间。
  • 在 C++ 中,使用 const 变量而不是 #define
  • 使用 const 而不是 #define 将是 c++ 的“最佳实践”,否则你很高兴。

标签: c++ coding-style default-value


【解决方案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
};

【讨论】:

    【解决方案2】:

    我看到你的函数是虚拟的 - 请注意默认参数不是继承的!

    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;
    };
    

    看看我的例子中的function2,它被内联函数重载了。优势:

    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 不需要(不幸的是,您需要 using 子句来使重载在继承类中可见) .

    旁注:我并不是说第一种方法是错误的还是坏的,我只是在展示另一种方法......

    【讨论】:

      猜你喜欢
      • 2023-03-08
      • 1970-01-01
      • 2015-10-09
      • 1970-01-01
      • 1970-01-01
      • 2017-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多