2010-12-06 17 views
7

¿Qué sucede cuando haces que una función miembro de una clase sea amiga de sí misma?Hacer que un miembro funcione como amigo

El siguiente código compila y ejecuta. Sin la declaración del amigo, se generan "demasiados argumentos para el operador" (y con razón). Me doy cuenta de que hacer esto no tiene ningún sentido, pero ¿alguien puede decirme qué está pasando aquí? ¿El amigo fuerza al compilador a omitir el parámetro predeterminado de alguna manera?

class Test 
{ 
public: 
    friend bool operator<(Test& lhs, Test& rhs) 
    { 
    return true; 
    } 
}; 

int main(int c, char** argv) 
{ 
    Test test1; 
    Test test2; 

    return test1 < test2; 
} 
+1

Para responder a su pregunta: Los amigos no pueden ser miembros de la clase de amistad en C++ 03, pero se permite en C++ 0x. –

+0

tengo curiosidad, ¿qué posible punto podría haber para permitir que una función miembro sea amiga de sí misma ya que ya tiene acceso completo? – radman

+0

Ver http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#77 o la historia (ese caso particular no es de mucha importancia, porque las clases anidadas tienen acceso completo al clase de anidación en C++ 0x y la mayoría de los compiladores de C++ 03 de todos modos). –

Respuesta

9

La diferencia es que un amigo no es miembro, incluso si toda la definición aparece dentro de la clase; más bien, la función se coloca en el espacio de nombres circundante. Por lo tanto, no hay puntero this. Mientras que un miembro operator< opera de manera implícita en this y el argumento explícito del lado derecho, un friend necesita tanto el lado izquierdo como el lado derecho proporcionados explícitamente como parámetros de función, de ahí el parámetro extra. Su versión friend es equivalente a poner la función después de la clase, excepto que tiene acceso a los miembros y bases private y protected y es implícitamente inline (aunque eso no significa que el compilador tenga que alinearlo, es solo una pista, pero es importante con respecto a la regla de una sola definición, ya que su función friend puede incluirse desde muchas unidades de traducción y vincularse sin problemas).

1

¿Qué pasa cuando se hace una función miembro de una clase de un amigo de sí mismo !?

Eso no tiene ningún sentido. ¿Cómo puede un miembro funcionar de una clase ser un amigo de la misma clase?

Ha sobrecargado operator < como una función de amigo (no como una función de miembro). Proporcionar la definición (cuerpo) de una función amiga dentro de la clase es legal. Sin embargo, es ilegal utilizar this dentro de su definición

friend bool operator<(Test& lhs, Test& rhs) 
{ 
    *this ; //error 
    return true; 
} 
Cuestiones relacionadas