C++中非静态成员作为默认参数

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

这种方法不够优雅,但是我是否错过了更好的方法?

编辑:值得一提的是,额外参数的原因是将一些与对象相关的状态成员外部化,以帮助多线程。


如果它有数据成员,根据定义它就不是无状态的。 - anon
尼尔说得有道理,文本已编辑。 - SmacL
2个回答

21

您觉得如何:

class MyClass
{
public:
   CMyObject A,B;

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

?


谢谢,Benoit。我知道一定有更好的方法。盯着屏幕太久了。 - SmacL
不客气。请注意,在C#和Java中不允许重载,这是弥补的方法。所以我想我没有发明什么 :-) - Benoît
我认为你的意思是在C#和Java中不允许默认参数 - 它们肯定允许重载(而且据说C# 4.0中有默认参数)。 - Michael Burr
1
我认为唯一的问题在于默认参数A发生变化,我们必须传递,比如说,C。那么要么在调用任何MyFunc()之前更新A,要么在每个地方调用MyFunc(C)而不是MyFunc()。 - sabertooth1990

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接