Newsgroup: it.comp.lang.c++
Titolo: Array di oggetti con costruttore con 1 parametro





Ciao a tutti,


avrei un problema, con un esempio è tutto chiaro 
: 


__________________________________________________


#define MAX_ELEM = 
100


 


class CClassProva{
 int 
m_z;


 


public:
 CClassProva(int 
z);
};


 


struct MIATRUCT {
    
int      x;
    
CClassProva  y/*[MAX_ELEM]*/;        
// CClassProva ha un costruttore del tipo 

};                     
        
          // CClassProva(int 
z);


 


class CMiaClass{
private 
:
 
    
int         
privateMember1;
    
int         
privateMember2;
    MIATRUCT    
privateMember3;


 


public : 
    
CMiaClass();
};


 


int main(int argc, char* 
argv[])
{


 return 
0;
}


 


/**
 * COSTRUCTOR 
CMiaClass
 */
CMiaClass::CMiaClass()
{
   
privateMember1 = 0;
   privateMember2 = 
0;
}


 


/**
 * COSTRUCTOR 
CClassProva
 */
CClassProva::CClassProva(int z)
{
 m_z = 
z;
}


 




__________________________________________________


Sostanzialmente il problema è che la classe CClassProva ha un 
costruttore 


con un parametro. Il compilatore mi da errore dicendo che non 
c'è un costruttore di default 


per la classe CClassProva.  A questo problema potrei 
ovviare mettendo un costruttore nella 


struttura MIASTRUCT e richiamandolo ( : privateMember3(val) ) 
nel costruttore della classe a cui 


appartiene, ma non è quello che mi serve, a me servirebbe un 
array di aggetti CClassProva.


Se provo a scommentare la riga 


/*[MAX_ELEM]*/


Creando quindi nella struttura 
MIATRUCT 
un array di oggetti (come 
servirebbe a me) 


CClassProva mi da alcuni errori.


 


Mi sfugge sicuramente qualche cosa .....


 


grazie


 



 };
Meglio:
typedef struct MIASTRUCT{
//ecc ecc
} MiaStruct;
Fatto questo FORSE va :)

 Fatto questo FORSE va :)
Sai che in C++ :
typedef struct _PROVA{
    ........
}PROVA;
č equivalente a :
struct PROVA{
    ........
};
_____________________________
Rileggi il mio post, ho un problema con i costruttori quando
dichiaro un array di oggetti il cui costruttore richiede un parametro
e non ho un costruttore di default.
Grazie.

 };
Non e` del tutto equivalente.  La prima definisce una struttura di
nome "_PROVA", e definisce "PROVA" come alias di "_PROVA".  La seconda
definisce una struttura di nome "PROVA".
        Mauro

Ciao Mauro,
una piccola parentesi, mi state sottolineando cose che non avevo
intenzione di chiedere, il post era rivolto al costruttore di un array di
oggetti (vedi
il mio precedente post) e non alla discussione su struct o define.
Comunque, per quanto riguarda le #define non ho mai visto un precomipatore
che si
sbagliasse a sostituire il nome (MAX_VAL, ad esempio) con il suo valore nel
sorgente
e il vantaggio è che non hai allocato memoria nell'uso.
Non sto dicendo che devi farne un abuso, ovviamente.
Al contrario nel caso di
const int MAX_ELEM = 100;
non solo allochi memoria per una variabile, ma devi anche renderla globale
 al modulo che ti interessa,
o peggio all'intero programma !) e sappiamo (tu ??!?) quanto siano da
evitare le variabili globali, non credi ?
ti ripeto che
typedef struct _PROVA
{
.....
}PROVA;
E' equivalente a
struct PROVA{
.....
};
Ovvero ho un tipo PROVA che posso definire.
Suggerimenti invece per il mio problema ?
bye.

 Suggerimenti invece per il mio problema ?
Non puoi fare un array di tipi senza costruttore di default.
Puoi usare std::vector, ma la soluzione migliore dipende da cosa vuoi
fare esattamente.
        Mauro

Ti sfuggono parecchie cose, a dire il vero...
CClassProva non ha un costruttore di default e quindi MIASTRUCT non riesce a
costruire le istanze di CClassProva !
Non è possibile costruire un array come hai fatto tu
CClassProva  y[MAX_ELEM];
per lo scopo che intendi perseguire. La sintassi è corretta ma non coerente
con il tuo intento!
In questo modo l'array y viene costruito con il costruttore di default per
ciascuna istanza, questo è tassativo: in C++ è così.
L'alternativa è usare un'array di puntatori da inizializzare con new e
distruggere con delete oppure utilizzare un std::vector (altamente
consigliato).
Inolte ti faccio notare che il codice è veramente poco leggibile e sembra
piuttosto un brutto programma in C con qualche classe giusto perché si pensa
che per programmare ad oggetti basti usare class in modo così spregiudicato.
Ti consiglio di usare classi ben realizzate in associazione a contenitori
STL, come std::vector, per scrivere codice leggibile, ben strutturato e
robusto.
Con l'avvento del C++ speravamo di non vedere più cose del tipo #define
MAX_ELEM 100
I motivi ti sono già stati spiegati e ignorarli non ti aiuterà: a te la
scelta.
Vorrai scrivere buoni programmi o continuerai in questo modo?

 evitare le variabili globali, non credi ?
Buffo che tu insista sull'uso del preprocessore quando hai per primo
proposto un esempio dei rischi che si corrono ad usarlo. Il
preprocessore non tiene conto della struttura sintattica del programma
e rende quindi piu' facile inserire errori.
Al giorno d'oggi i compilatori decenti sono perfettamente in grado di
evitare di allocare spazio per una variabile intera costante, cosa che
e' esplicitamente consentita dallo standard.
Ciao,
Nicola

 ha scritto nel messaggio
news:cm5qk4$lcc$1...@lacerta.tiscalinet.it...
