16

我正在重构大量代码,我必须向许多函数添加一个额外的参数,这些函数总是具有该对象成员的值。就像是

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

但是我不允许有一个非静态成员的默认参数。我读过这个类似的问题,这表明这是不可能的,但我想知道是否有任何合理的解决方法。原因是 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,额外参数的原因是从相关对象中外部化一些与状态相关的成员以帮助多线程。

4

2 回答 2

21

怎么样 :

class MyClass
{
public:
   CMyObject A,B;

   void MyFunc()
   { 
     MyFunc(A); 
   }
   void MyFunc(CMyObject &Object);
};

?

于 2010-02-19T12:10:18.960 回答
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)

于 2010-02-19T12:49:41.550 回答