【问题标题】:Non static members as default parameters in C++非静态成员作为 C++ 中的默认参数
【发布时间】:2011-01-18 18:15:48
【问题描述】:

我正在重构大量代码,我必须向许多函数添加额外的参数,这些函数将始终具有该对象成员的值。类似的东西

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,额外参数的原因是从相关对象中外部化一些与状态相关的成员以帮助多线程。

【问题讨论】:

  • 如果它有一个数据成员,根据定义它不是无状态的。
  • 公平点尼尔,文本已编辑。

标签: c++ default-value non-static


【解决方案1】:

怎么样:

class MyClass
{
public:
   CMyObject A,B;

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

?

【讨论】:

  • 谢谢 Benoit,我知道必须有更好的方法。盯着屏幕太久了。
  • 不客气。请注意,C# 和 Java 中不允许重载,这是一种补偿方式。所以我想我什么都没发明:-)
  • 我认为您的意思是 C# 和 Java 中不允许使用默认参数 - 它们当然允许重载(默认参数显然在 C# 4.0 中)
  • 我认为唯一的问题是如果默认参数 A 更改并且我们必须传递,比如说 C。那么你要么在调用任何 MyFunc() 之前更新 A 要么调用到处都是 MyFunc(C) 而不是 MyFunc()
【解决方案2】:

另一种方式:

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)

【讨论】:

    猜你喜欢
    • 2011-05-31
    • 1970-01-01
    • 2016-07-28
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    • 1970-01-01
    • 2019-11-29
    • 2015-05-30
    相关资源
    最近更新 更多