Я осуществляю рефакторинг большой объем кода, где я должен добавить дополнительный параметр ко многим функциям, которые будут всегда иметь значение члена того объекта. Что-то как
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;
}
Это - меньше, чем elgant, но является там лучшим способом сделать это, что я отсутствую?
Править: 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);
}
};
Это делает невозможным даже передачу члена MyObject из другого экземпляра MyClass. Три возможных варианта вызова MyFunc: .MyFunc ()
, .MyFunc (& MyClass :: A)
и .MyFunc (& MyClass :: B)