Newsgroup: it.comp.lang.c++
Titolo: Problemi con strutture!!!

Salve a tutti,
ho un grosso problema che non riesco a risolvere e spero che possiate
aiutarmi!!!
Eccolo: ho creato diverse strutture (TStruct1, TStruct2, TStruct3, ecc.).
Adesso grazie a una funzione (che ha un intero come input) vorrei che mi
ritorna una delle strutture. Per esempio, se il parametro in entrata vale 1
vorrei che la funzione mi ritorna la TStruct1 (o la sua istanza), se il
parametro vale 2 mi ritorna TStruct1 e così via.
Esempio:
... (non so cosa mettere) MiaFunzione(int Numero)
   {
     switch( Numero)
      {
        case 1: return TStruct1; // o qualche cosa di simile...
                   break;
        case 2: return TStruct2; // o qualche cosa di simile...
                   break;
        case 3: return TStruct3; // o qualche cosa di simile...
                   break;
      }
   }
In modo da fare:
MyStruttura MiaFunzione(2);
send(SOCKET, (char *) MyStruttura,sizeof(MyStruttura);
Ecco il problema: devo inviare delle strutture attraverso i socket, ma io
ricevo solo un numero, e dal numero devo prendere la struttura. Praticamente
é un pò come fare del polimorfismo...
Qualcuno può aiutarmi??? Lo so che la spiegazione fa schifo, ma se vedete il
problema dovrebbe essere chiaro come fare.
Grazie mille....
Matteo Ferrini
Matteo Ferrini

 wrote in message
8i5dgc$b1e$1...@news1.sunrise.ch...


 
Usa proprio il polimorfisomo, allora. Il mio suggerimento è incapsulare
nella classe la struttura, necessiariamente POD, che devi inviare via
socket, unitamente alla logica che trasmette le informazioni.
Ci serve:
1. Una classe astratta con un metodo la cui funzione logica è inviare i
dati verso la socket. 
2. Una factory che in base all'esigenza crei un'instanza della classe
adatta allo scopo.
Qualcosa del genere...
  class sendable_via_socket
  {
    public:
    virtual int send( int fd ) = 0;
  };
 
 template< class _POD > // _POD dev'essere una struct del C
 class pod_sender: public sendable_via_socket
 {
   public:
   _POD  data;
   int send( int fd ) {
      return send( fd, &data, sizeof(_POD));
   }
  };
Poi prepariamo una funzione che in base alle esigenze crei e restituisca
un'instanza della classe giusta:
 sendable_via_socket* 
 crea_oggetto_giusta( int i )
 {
   if( i == 1 ) return new pod_sender<MyStruct1>;
  // etc...
 }
 Il codice client sarà: 
 sendable_via_socket* to_send;
 to_send = crea_oggetto_giusto( 1 );
 to_send->send( fd );
E' solo un'idea, spero possa esserti utile.
Max

ritorna una delle strutture.
Due possibili approcci,
a) definire tre funzioni in overloading:
      void MiaFunzione(TStruct1&);
      void MiaFunzione(TStruct2&);
      void MiaFunzione(TStruct3&);
   e usare di volta in volta quella che serve...
b) Applicare il pattern factory.
Paolo
--------------------------------------------------
  Paolo Marotta
  Computer Science, University of Pisa
  home:   
http://www.cli.di.unipi.it/~marotta
--------------------------------------------------

 b) Applicare il pattern factory.
Scusa, il Factory è diverso dall'Abstract Factory o dal Factory Method
oppure è uno di questi ultimi due? Se è diverso, sai indicarmi dove
posso trovare, su Internet, un articolo al riguardo?
EMG

oppure è uno di questi ultimi due?
Sorry...
Era un riferimento dato "en passant" (spero di aver scritto bene)...mi
riferivo al factory method e voleva essere una idea di dove andare a
cercare (non ho approfondito la cosa per cui potrebbe non essere la
soluzione giusta al problema originario).
Per maggiori info, la bibbia e` il solito "Design Patterns" di GOF
