voglio un tipo Un che produrrà il suo dato di nascosto a un oggetto di tipo T ma nascondere il dato da tutti gli altri. Il mio compilatore C++ sembra essere GCC 4.4, ma non dovrebbe essere importante. Perché non funzionerà?Come nascondere un dato da tutti, ma di classe 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;
}
Per inciso, questo funziona bene, solo che non riesce a nascondere il 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;
}
non C++ in realtà non consente una classe amico da specificare al momento della compilazione come un parametro di modello? Perchè no? In caso contrario, quale tecnica alternativa dovrei usare per nascondere il dato? (Si preferirebbe una tecnica in fase di compilazione, se possibile.)
Qual è il mio malinteso qui, per favore?
(Vedo alcune risposte alle domande correlate here e here, ma non rispondono alla mia domanda specifica o non riesco a capire che lo fanno. In ogni caso, forse sto usando la tecnica sbagliata del tutto. rimangono interessati perché la classe amico T non riesce, quello che voglio sapere è come nascondere il dato, sia con un amico o con altri mezzi.)
Grazie.
Buon consiglio. A meno che non riesca a trovare qualcosa di meglio, dovrei seguire il consiglio. Grazie. – thb
Controlla anche l'idioma passkey suggerito da Xeo, così come l'idioma del procuratore-cliente. È passato un po 'di tempo da quando ho letto di questi, quindi la mia soluzione potrebbe benissimo essere una variante di quegli idiomi. –