Newsgroup: it.comp.lang.c++
Titolo: linking e classi proxy

Salve a tutti ^^
Supponendo che io abbia una classe "example" e che voglia nasconderne i 
dati private all'end user, scrivo quindi una classe "proxy" che contenga 
tutte le funzioni membro pubbliche ed un puntatore a example come membro 
private. Il file proxy.hpp sarï¿œ qualcosa del genere:
class example; //necessario per il membro private
class proxy {
 
	public:
	proxy();
	//tutte i prototipi di example tali e quali...
	~proxy();
	private:
 
	example* ptr;
}
e va bene.
Poi compilo il file proxy.cpp che implementa tutte le funzioni 
richiamando semplicemente le funzioni membro di example tramite il 
puntatore ptr, del tipo (siamo dentro proxy.cpp):
proxy::proxy() {
	this->ptr = new example();
}
void proxy::sayHello() {  //Funzione della classe example
	this->ptr->sayHello();
}
e va bene.
Il mio problema ï¿œ: quando vado a creare i file example.cpp e example.hpp 
  poi compilo normalmente creando un example.o che poi ovviamente vado a 
linkare nella creazione di proxy.o, per fare in modo che i riferimenti 
alle funzioni di example (richiamate dentro ogni funzione di proxy) ci 
siano, e poi compilo:
g++ -c example.cpp -o example.o
g++ -c proxy.cpp -o proxy.o example.o
e tutto va bene.
Poi quando vado ad usare la classe proxy in un sorgente client 
d'esempio, si rompe l'universo, e non c'ï¿œ nessun riferimento.
Il problema si risolve includendo in proxy.cpp SIA example.cpp CHE 
example.hpp (quindi sia l'interfaccia che le implementazioni), e non ï¿œ 
un problema dal punto di vista del mascheramento dei dati (visto che 
alla fine io delivero soltanto proxy.hpp e proxy.o) ma non potendo 
creare un precompilato di example da usare nella compilazione di proxy, 
dovrei ricompilare tutto per ogni modifica della classe proxy, no?
Spero di aver dato tutte le informazioni e di non essere stato troppo 
criptico...
Grazie in anticipo
saluti
M.

 example.hpp 
Difficile dire qualcosa. Sarebbe gradito il messaggio di errore che ottieni.
E.

?manu* ha scritto:

e c'hai anche ragione
$ make
g++ -c -Wall -Wextra -pedantic -pedantic-errors  interface.cpp -o 
interface.o -l implementation.o
g++ -Wall -Wextra -pedantic -pedantic-errors  main.cpp -o main interface.o
main.cpp:6: warning: unused parameter 'argc'
main.cpp:6: warning: unused parameter 'argv'
interface.o: In function `interface::interface(int)':
interface.cpp:(.text+0x2d): undefined reference to 
`implementation::implementation(int)'
interface.o: In function `interface::interface(int)':
interface.cpp:(.text+0x8f): undefined reference to 
`implementation::implementation(int)'
interface.o: In function `interface::setValue(int)':
interface.cpp:(.text+0xe3): undefined reference to 
`implementation::setValue(int)'
interface.o: In function `interface::getValue() const':
interface.cpp:(.text+0x101): undefined reference to 
`implementation::getValue() const'
collect2: ld returned 1 exit status
make: *** [main] Errore 1
interface ï¿œ la classe proxy, implementation la classe proxata.
M

 g++ -Wall -Wextra -pedantic -pedantic-errors  main.cpp -o main interface.o
devi includere anche implementation.o in compilazione
E.


ah certo.
*facepalm*
comunque allora non mi conviene fare cosï¿œ, dovrei distribuire entrambi i 
file oggetto: della classe proxy e dell'originale... conviene compilare 
tutto in un solo .o includendo nella definizione della classe proxy 
anche l'implementazione della classe originale.
Sbaglio?
Grazie mille manu, e scusami per la perdita di tempo...
M


La classe proxy dovrebbe, a mio parere, avere solo funzioni inline,
dunque non dovresti avere un proxy.o
Comunque ï¿œ possibile mettere diversi file .o assieme facendo una libreria.
E.