Ответ 1
Как насчет:
class MyClass
{
public:
CMyObject A,B;
void MyFunc()
{
MyFunc(A);
}
void MyFunc(CMyObject &Object);
};
?
Я рефакторинг большого количества кода, где мне нужно добавить дополнительный параметр к ряду функций, которые всегда будут иметь значение члена этого объекта. Что-то вроде
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)