2010-02-19 86 views
13

我重构了大量的代码,我必须为大量函数添加额外的参数,这些函数将始终具有该对象成员的值。像非静态成员作为C++中的默认参数

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

如果它有一个数据成员,根据定义它不是无状态的。 – 2010-02-19 12:11:52

+0

公平点尼尔,文本编辑。 – 2010-02-19 12:34:46

回答

18

如何:

class MyClass 
{ 
public: 
    CMyObject A,B; 

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

+0

谢谢Benoit,我知道必须有更好的方法。盯着屏幕太长。 – 2010-02-19 12:28:28

+0

不客气。请注意,C#和Java中不允许重载,这是补偿的方式。所以我想我没有发明任何东西:-) – 2010-02-19 14:40:09

+0

我认为你的意思是默认参数在C#和Java中是不允许的 - 它们肯定允许超载(默认参数显然是在C#4.0中) – 2010-02-19 15:18:58

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)