Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 非静态成员作为C++;_C++_Default Value_Non Static - Fatal编程技术网

C++ 非静态成员作为C++;

C++ 非静态成员作为C++;,c++,default-value,non-static,C++,Default Value,Non Static,我正在重构大量代码,其中我必须向许多函数添加一个额外的参数,这些函数的值总是该对象的一个成员。差不多 class MyClass { public: CMyObject A,B; void MyFunc(CMyObject &Object); // used to be void MyFunc(); }; 现在,我真的想把它读出来 class MyClass { public: CMyObject A,B; void MyFunc(CMyObject

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

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;
}
这比埃尔甘特还差,但有没有更好的方法让我错过了呢

Edit:FWIW,额外参数的原因是将相关对象中的一些状态相关成员外部化,以帮助多线程。

如何:

class MyClass
{
public:
   CMyObject A,B;

   void MyFunc()
   { 
     MyFunc(A); 
   }
   void MyFunc(CMyObject &Object);
};
?另一种方式:

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)

如果它有一个数据成员,根据定义它不是无状态的。Fair point Neil,文本编辑。感谢Benoit,我知道有更好的方法。盯着屏幕看太久了,不客气。请注意,C#和Java中不允许重载,这是一种补偿方法。所以我想我还没有发明任何东西:-)我想你的意思是默认参数在C#和Java中是不允许的-它们当然允许重载(默认参数显然在C#4.0中)我想唯一的问题是如果默认参数A发生了变化,我们必须通过,比方说,然后要么在调用任何MyFunc()之前更新A,要么在任何地方调用MyFunc(C)而不是MyFunc()