Quiero un tipo Un que dará su dato escondido a un objeto de tipo T pero ocultar el dato de todos los demás. Mi compilador C++ pasa a ser GCC 4.4, pero eso no debería importar. ¿Por qué no funciona esto?Cómo ocultar un dato de todos, pero la clase T
#include <iostream>
template <class T> class A {
private:
int n1;
public:
friend class T;
A(const int n0 = 0) : n1(n0) {}
};
class B {
public:
int f(const A<B> a) const { return a.n1; }
B() {}
};
int main() {
const A<B> a(5);
const B b;
const int m = b.f(a);
std::cout << m << "\n";
return 0;
}
Por cierto, esto funciona bien, excepto que no logra ocultar el dato:
#include <iostream>
template <class T> class A {
private:
int n1;
public:
int n() const { return n1; }
A(const int n0 = 0) : n1(n0) {}
};
class B {
public:
int f(const A<B> a) const { return a.n(); }
B() {}
};
int main() {
const A<B> a(5);
const B b;
const int m = b.f(a);
std::cout << m << "\n";
return 0;
}
que C++ hace realmente no permite una clase de amigo que se especificará en tiempo de compilación como un parámetro de plantilla? Por qué no? Si no, ¿qué técnica alternativa debería usar para ocultar el dato? (Uno preferiría una técnica de tiempo de compilación si fuera posible.)
¿Cuál es mi malentendido aquí, por favor?
(I ver algunas respuestas a las preguntas relacionadas here y here, pero o bien no responden a mi pregunta en particular o que no entienden que lo hagan. En cualquier caso, tal vez yo estoy usando la técnica equivocada por completo. Aunque seguir interesado en por qué la clase de amigo T falla, lo que realmente quiero saber es cómo ocultar el dato, ya sea con un amigo o por otros medios.)
Gracias.
Buen consejo. A menos que se me ocurra algo mejor, debería seguir el consejo. Gracias. – thb
También revisa la frase clave usada por Xeo, así como el idioma de abogado-cliente. Ha pasado un tiempo desde que leí sobre ellos, por lo que mi solución puede ser una variante de esos modismos. –