最佳实践 C++:重用多个方法的默认参数
Best practice C++: Reuse default arguments for multiple methods
给定一个具有不同函数(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 中创建一些私有常量吗?
你可以这样做:
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
};
我看到你的函数是虚拟的 - 请注意默认参数不会被继承!
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
要求强制转换与默认参数一起使用(无需在继承 class 中重复它们),function2
不需要(不幸的是,您需要 using 子句来制作继承 class 中可见的重载)。
旁注:我并不是说第一种方法是错误的或不好的,我只是在展示另一种方法...
给定一个具有不同函数(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 中创建一些私有常量吗?
你可以这样做:
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
};
我看到你的函数是虚拟的 - 请注意默认参数不会被继承!
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
要求强制转换与默认参数一起使用(无需在继承 class 中重复它们),function2
不需要(不幸的是,您需要 using 子句来制作继承 class 中可见的重载)。
旁注:我并不是说第一种方法是错误的或不好的,我只是在展示另一种方法...