|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: May 2004
Città: Napoli
Messaggi: 773
|
[C++] Array di oggetti e costruttore non default
Ciao a tutti!
Ieri sera mi sono trovato ad affrontare questo problema: data una classe di esempio, desidero creare un array dinamico di oggetti di classe Prova, e richiamare su questi un costruttore non con argomenti di default (con x e y variabili già definite nel corso del programma): Codice:
class Prova {
private:
int numeretto;
public:
Prova(int n = 5) {
numeretto = n;
}
};
[...]
Prova *prova_ptr = new Prova[x](y);
Ho fatto una ricerca leggendo che effettivamente la sintassi che uso è corretta, mentre su un altro sito ho letto che in questi casi si consiglia di usare vector, ma in che modo dovrei passargli l'argomento del costruttore? Grazie per le dritte =)
__________________
If builders built buildings the way programmers wrote programs, then the first woodpecker that came along would destroy civilization. --Gerald Weinberg |
|
|
|
|
|
#2 | |
|
Member
Iscritto dal: Feb 2008
Messaggi: 32
|
Quote:
io risolvo cosi Codice:
const int numero_classi = 7;
// puntatore a puntatori di oggetti
Prova** puntatore = new Prova*[numero_classi];
for (int i = 0; i < numero_classi; i++)
{
// richiamo il costruttore per ogni singolo elemento istanziato
// e gli assegno il valore dell'indice corrente i
puntatore[i] = new Prova(i);
}
Compilatore: MSVC++ 9.0 OS: WinXP Professional Ultima modifica di marra11mg : 21-04-2008 alle 13:40. |
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Due sono le soluzioni "semplici".
Una e' quella vista sopra, con l'uso dei puntatori, che comporta pero' il doversi gestire la memoria cosi' allocata. Un'altra e' quella di usare il vector, in modo simile al seguente Codice:
#include <iostream>
#include <vector>
using namespace std;
class Prova {
private:
int numeretto;
public:
Prova(int n = 5) {
numeretto = n;
}
};
// Prova *prova_ptr = new Prova[x](y);
int main()
{
vector<Prova> v(5,Prova(10));
}
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
|
|
|
|
#4 | |
|
Senior Member
Iscritto dal: May 2004
Città: Napoli
Messaggi: 773
|
Quote:
Davvero non c'è modo di richiamare un costruttore con argomenti non di default in questi casi? Edit: non avevo letto il post di marco.r... dunque è assodato che new non permette di passare argomenti al costruttore quando si creano array? Penso che userò vector allora
__________________
If builders built buildings the way programmers wrote programs, then the first woodpecker that came along would destroy civilization. --Gerald Weinberg Ultima modifica di Albi89 : 21-04-2008 alle 14:14. |
|
|
|
|
|
|
#5 |
|
Bannato
Iscritto dal: Feb 2005
Città: Roma
Messaggi: 7029
|
scusa ma dato che il costruttore della classe Prova ha il valore di default al parametro, che ci vuole a fare così?
Codice:
class Prova
{
public:
Prova()
{
Prova(5);
}
Prova(int n)
{
...
}
};
|
|
|
|
|
|
#6 | |
|
Senior Member
Iscritto dal: Feb 2006
Messaggi: 1304
|
Quote:
![]() Chiamare un costruttore, non dovrebbe creare un nuovo oggetto?
Ultima modifica di Tommo : 21-04-2008 alle 16:15. |
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: May 2004
Città: Napoli
Messaggi: 773
|
Quote:
Codice:
Prova *prova_ptr = new Prova[x];
__________________
If builders built buildings the way programmers wrote programs, then the first woodpecker that came along would destroy civilization. --Gerald Weinberg |
|
|
|
|
|
|
#8 | |
|
Senior Member
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
|
Quote:
Ti stai cacciando in un bel casino, non puoi cercare una strada piu' semplice senza dover passare y? Comunque, quello che vuoi fare si risolve con una placement new. Devi fare una cosa di questo tipo: Codice:
class C
{
public:
C()
{
}
C(int x)
{
val = x;
}
private:
int val;
};
C* v = new C[100];
for (int i = 0; i < 100; ++i)
{
new (&v[i]) C(10); // PLACEMENT NEW
}
delete[] v;
__________________
"We in the game industry are lucky enough to be able to create our visions" @ NVIDIA |
|
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: May 2004
Città: Napoli
Messaggi: 773
|
Quote:
__________________
If builders built buildings the way programmers wrote programs, then the first woodpecker that came along would destroy civilization. --Gerald Weinberg |
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
![]() Nel codice in OP c'e' un valore di default, per cui chiamare esplicitamente il costruttore con un argomento non e' necessario, ma penso che l'autore intendesse il caso in cui l'argomento con cui inizializzare e' diverso da quello di default. Mi correggo: e' codice valido ma non fa quello che vorresti.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele Ultima modifica di marco.r : 21-04-2008 alle 23:58. |
|
|
|
|
|
|
#11 | |
|
Member
Iscritto dal: Feb 2008
Messaggi: 32
|
Quote:
Quando esegui questa istruzione: Codice:
Prova** puntatore = new Prova*[numero_classi]; Infatti li crei un oggetto alla volta col parametro che ti pare, passato al costruttore della SINGOLA classe. Comunque, cerca di essere più chiaro, perchè dal topic, non si capisce se vuoi creare un array di classi lungo X elementi, oppure creare la classe passando 2 parametri al costruttore (in quel caso basterebbe aggiungere un nuovo costruttore alla classe stessa). |
|
|
|
|
|
|
#12 |
|
Member
Iscritto dal: Mar 2008
Città: Albano Laziale
Messaggi: 49
|
[c++] riempire array di 10 elementi e farne una somma
edit: ho sbagliato devo aprire un new topic
|
|
|
|
|
|
#13 | |
|
Senior Member
Iscritto dal: May 2004
Città: Napoli
Messaggi: 773
|
Quote:
Per il codice, qualche piccola modifica andrebbe fatta... ad esempio se io avevo il mio array di oggetti Prova, mi ci riferirei con array[i] mentre all'array di puntatori con *array[i] o dovrei usare l'operatore freccia... sono modifiche di piccola entità ma mi costringerebbero comunque a ritoccare quì e lì =) Comunque grazie per tutti i consigli, alla fine è stata una scusa per snellire di molto il codice complessivo del programma, ma ancora mi sembra strano che non esista una notazione più concisa per una cosa che all'apparenza è così normale.
__________________
If builders built buildings the way programmers wrote programs, then the first woodpecker that came along would destroy civilization. --Gerald Weinberg |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 21:37.





















