我正在重构大量的代码,我必须在一些函数中添加一个额外的参数,这些函数总是具有该对象成员的值。像
这样的东西class MyClass
{
public:
CMyObject A,B;
void MyFunc(CMyObject &Object);
// used to be void MyFunc();
};
现在,我真的很想读它
class MyClass
{
public:
CMyObject A,B;
void MyFunc(CMyObject &Object = A);
};
但是我不允许有一个非静态成员的默认参数。我读过this similar question,这表明这是不可能的,但我想知道是否有任何合理的解决方法。原因是95%的时间将使用默认参数,因此使用默认参数将大大减少我必须更改的代码量。到目前为止,我最好的解决办法是这样的;
class MyClass
{
public:
CMyObject A,B;
void MyFunc(BOOL IsA = TRUE);
};
void MyClass::MyFunc(BOOL IsA)
{
CMyObject &Object = A;
if (!IsA)
Object = &B;
}
这不是很优雅,但有没有更好的方法来做到这一点,我错过了?
编辑: FWIW,额外参数的原因是从相关对象外部化一些与状态相关的成员以帮助多线程。
答案 0 :(得分:20)
怎么样:
class MyClass
{
public:
CMyObject A,B;
void MyFunc()
{
MyFunc(A);
}
void MyFunc(CMyObject &Object);
};
答案 1 :(得分:4)
另一种方式:
class MyClass
{
public:
MyObject A,B;
void MyFunc(MyObject MyClass::*myObject = &MyClass::A) {
MyObject& obj = *(this->*myObject);
}
};
这使得甚至无法从另一个MyClass实例传入MyObject成员。调用MyFunc的三个有效选项是.MyFunc()
,.MyFunc(&MyClass::A)
和.MyFunc(&MyClass::B)