PDA

View Full Version : [visual c++] operatore new e costruttori con argomenti


dileoa
09-05-2011, 14:55
Salve
sto scrivendo una applicazione, in cui devo creare un array di oggetti della classe DGeneric passando come argomento un intero Parameter.
La sintassi dovrebbe essere:
DGeneric* Generic;
Generic = new DGeneric[10](Parameter);
Il compilatore Visual C++ 2008 però non mi riconosce le istruzioni anzi ho trovato su internet che Visual non accetta tale costrutto.
Come posso ovviare al problema?
Grazie
ADL

Efem
09-05-2011, 15:37
Prova così:


DGeneric* Generic[10];
int i;

for( i=0; i<10; i++ )
Generic[i] = new DGeneric( i );

dileoa
10-05-2011, 14:34
Sorry,:doh:
nel tentativo di semplificare la lettura, mi sono reso conto di essere stato troppo generico nella descrizione del problema. Il listato corretto è:

class DFool
{
public:
...
DFool(int i,DArgument Argument);
private:
DGeneric* Generic;
...
}

...

DFool::DFool(int i,DArgument Argument)
{
...
Generic = new DGeneric[i](Argument);
...
}

Quindi il costruttore della classe DFool deve creare un array di oggetti DGeneric inizializzati con l'oggetto Argument.:confused: La dimensione dell'array i non è nota a priori.
:muro:Il compilatore Visual C++ 2008 non riconosce la sintassi new DGeneric[...](...) (ho trovato su internet che Visual C++ non accetta tale costrutto).
:help:Come posso ovviare al problema?

ADL

tomminno
10-05-2011, 16:36
Abbastanza semplicemente così:


class DFool
{
public:
...
DFool(int i,DArgument Argument);
private:
DGeneric* Generic;
...
}

...

DFool::DFool(int i,DArgument Argument)
{
Generic = new Generic[i];
for (int j = 0; j < i; j++)
Generic[i] = new DGeneric(Argument);
...
}

dileoa
10-05-2011, 16:43
Ok, ho provato:

Volee=new DVolee[GetSessionVolee()];
for(int i=0;i<GetSessionVolee();i++)Volee[i]=new DVolee(GetVoleeShoots());

dove GetSessionVolee() e GetVoleeShoots() restituiscono degli interi. Questo è quello che mi risponde il compilatore:

1> error C2679: '=' binario: non è stato trovato alcun operatore che accetti un operando destro di tipo 'Project_Amaltea::DVolee *'. È anche possibile che non vi siano conversioni accettabili.
1> c:\users\antonio\documents\visual studio 2008\project_amaltea\project_amaltea\DVolee.h(16): potrebbe essere 'Project_Amaltea::DVolee &Project_Amaltea::DVolee::operator =(const Project_Amaltea::DVolee &)'
1> durante la ricerca di corrispondenza con l'elenco di argomenti '(Project_Amaltea::DVolee, Project_Amaltea::DVolee *)'
ADL

tomminno
11-05-2011, 10:32
Scusami, nella fretta di rispondere mi sono dimenticato delle basi :fagiano:
Ovviamente Generic deve essere un array di puntatori a DGeneric

class DFool
{
public:
...
DFool(int i,DArgument Argument);
private:
DGeneric** Generic;
...
}

...

DFool::DFool(int i,DArgument Argument)
{
Generic = new DGeneric*[i];
for (int j = 0; j < i; j++)
Generic[i] = new DGeneric(Argument);
...
}

dileoa
11-05-2011, 11:04
Ho capito. Mi sembra una buona idea. L'unica cosa che così ho bisogno di due indici per puntare un singolo oggetto. Confermi?

Generic[i][j].Fool();

tomminno
11-05-2011, 12:48
Ho capito. Mi sembra una buona idea. L'unica cosa che così ho bisogno di due indici per puntare un singolo oggetto. Confermi?

Generic[i][j].Fool();


E perchè mai?

Generic[i]->Fool();