2010-02-19 16 views
13

Estoy refacturando una gran cantidad de código donde tengo que agregar un parámetro adicional a una serie de funciones, que siempre tendrán el valor de un miembro de ese objeto. Algo así comoMiembros no estáticos como parámetros predeterminados en C++

class MyClass 
{ 
public: 
    CMyObject A,B; 

    void MyFunc(CMyObject &Object); 
    // used to be void MyFunc(); 
}; 

Ahora, me gustaría realmente como para que se lea

class MyClass 
{ 
public: 
    CMyObject A,B; 

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

Pero no se me permite tener un parámetro por defecto que es un miembro no estática. He leído this similar question que sugieren que esto no es posible, pero me pregunto si hay alguna solución razonable. La razón es que el 95% del tiempo se utilizará el parámetro predeterminado y, por lo tanto, el uso de un parámetro predeterminado reduciría enormemente la cantidad de código que tengo que cambiar. Mi mejor solución hasta ahora es algo como esto;

class MyClass 
{ 
public: 
    CMyObject A,B; 

    void MyFunc(BOOL IsA = TRUE); 
}; 

void MyClass::MyFunc(BOOL IsA) 
{ 
    CMyObject &Object = A; 
    if (!IsA) 
     Object = &B; 
} 

Esto es menos de elgant, pero hay una mejor manera de hacer esto que me falta?

Edit: FWIW, la razón del parámetro adicional es externalizar algunos miembros relacionados con el estado del objeto en cuestión para ayudar a multi-threading.

+0

Si tiene un miembro de datos, por definición no es apátrida. –

+0

Fair point Neil, texto editado. –

Respuesta

18

¿Qué tal:

class MyClass 
{ 
public: 
    CMyObject A,B; 

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

?

+0

Gracias Benoit, sabía que tenía que haber una mejor manera. Mirando la pantalla demasiado tiempo. –

+0

De nada. Tenga en cuenta que las sobrecargas no están permitidas en C# y Java, y esta es la forma de compensar. Así que supongo que no he inventado nada :-) –

+0

Creo que te refieres a que los parámetros predeterminados no están permitidos en C# y Java - ciertamente permiten sobrecargas (y los parámetros predeterminados están aparentemente en C# 4.0) –

4

Otra forma:

class MyClass 
{ 
public: 
    MyObject A,B; 

    void MyFunc(MyObject MyClass::*myObject = &MyClass::A) { 
     MyObject& obj = *(this->*myObject); 
    } 
}; 

Esto hace que sea incluso imposible pasar en un miembro de MiObjeto desde otra instancia MiClase. Sus tres opciones válidas para llamar a MyFunc son .MyFunc(), .MyFunc(&MyClass::A) y .MyFunc(&MyClass::B)

Cuestiones relacionadas