Newsgroup: it.comp.lang.c++
Titolo: Problemi con l'ereditarietà

Salve, ho scritto delle classi che implementano un client ed un server TCP
vi riporto l'header:
class TCPSocket
{
   protected:
      int            sock_ds;          //descrittore della socket
      sockaddr_in    server_address;
      hostent *      host;
      string 	     hostname;         //nome dell'host remoto
      int            port_number;      //numero di porto remoto
   public:
      TCPSocket();
      ~TCPSocket();
      string recv(int len=-1);                        
      string  remote_name() {  return hostname;  }      
      int     remote_port() {  return port_number;  }   
      int    sock_descriptor() {  return sock_ds;  }    
};
class TCPClient :public TCPSocket
{
   public:
      TCPClient(string dest,int port);
      int send(string message);
};
class TCPServer :public TCPSocket
{
   public:
      TCPServer (int port);
      int     accept();
      int     send(string message);
      void    hangup();
      int     sec_sock_ds;                       
      int     sec_sock_descriptor()   {  return sec_sock_ds;  }
};
I costruttori di TCPClient e TCPServer richiamano quello di TCPSocket e
in piu' fanno altre cose.
Sto avendo dei problemi ad usare la funzione send. Faccio notare che essa
e' presente in entrambe le classi con la stessa interfaccia ma 
l'implementazione e' leggermente diversa. Se in un programma scrivo :
TCPServer server(port);
....
string message(" bla bla bla");
server.send(message);
ottengo un errore di compilazione (uso Gcc 2.95) del tipo :
Undefined Reference to `TCPSocket::send(basic_string<...>)'
Perchè non funziona? perchè cerca un metodo di TCPSocket quando server
è invece dichiarato come TCPServer?
 
-- 
  _  _ >>Now on Linux<<  _     || ICQ number.................Non lo uso
 | \| |___ _____ ___ ___|_|___ || Home-Page ................Non ce l'ho
 | .` | -_|     | -_|_ -| |_ -||| E-Mail................Non l'avrai mai
 |_|\_|___|_|_|_|___|___|_|___||| Un Nemesis che ha pochi e-contatti ;)
.

 è invece dichiarato come TCPServer?
Negli spezzoni postati da te è tutto Ok. Verifica che server nella linea
in cui scrivi server.send(message) faccia riferimento alla variabile
server (non è che c'è un altro nome "server" che la nasconde?). Verifica
se la linea in cui ti da errore è quella o un'altra. Verifica che string
significhi la stessa cosa nell'header in cui dichiari TCPServer (per
esempio perchè manca std:: ?) e nel file in cui la richiami.
Prova a ridurre al minimo il codice fino ad ottenere poche righe che
dovrebbero essere compilabili ma non lo sono.
--
Andrea Ferro
---------
Brainbench C++ Master. Scored higher than 97% of previous takers
Scores: Overall 4.46, Conceptual 5.0, Problem-Solving 5.0
More info 
http://www.brainbench.com/transcript.jsp?pid=2522556

dovrebbero essere compilabili ma non lo sono.
Proverò cosi'.


 Proverò cosi'.
Rimuovi tutti i metodi che non servono e posta un header minimale e un
.cpp minimale che dovrebbero compilare ma non compilano.


Proverò cosi'.
Problema risolto :)
Avevo mancato alcune dipendenze nel makefile, e cosi' quando lanciavo
make non venivano ricompilati tutti i file che dovevano esserlo.


.cpp minimale che dovrebbero compilare ma non compilano.
Grazie lo stesso ma come dico nell'altro post il problema e' risolto :)


Perchè è una pessima abitudine? 
Perché facendo così nei file .cpp che includono il tuo header è come
se ci fosse un "using namespace ...", se tutti i programmatori
facessero così negli header si annullerebbero tutti i vantaggi dei
namespace e in più vi sarebbero sicuramente conflitti fra i nomi.
-- 
Marco Barisione (ICQ 84277092)
Su it.news.gruppi si sta discutendo della creazione di it.comp.lang
dove si parlerà dei linguaggi senza un proprio newsgroup e dei
confronti fra i diversi linguaggi.
Se sei interessato unisciti alla discussione.

namespace e in più vi sarebbero sicuramente conflitti fra i nomi.
Beh ... tutto chiaro.
Un Nemesis che ha ancora molto da imparare ... e veramente poco tempo
per farlo :(
