Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce
Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce
REDMI Note 17 Pro porta in fascia media una batteria da 8.340 mAh con ricarica HyperCharge a 67W, un display AMOLED da 6,83 pollici capace di picchi di luminosità molto elevati e una struttura certificata TÜV SÜD contro cadute e infiltrazioni d'acqua, il tutto racchiuso in una scocca da 223 grammi. Lo abbiamo provato per diversi giorni tra fotocamera, prestazioni, autonomia e prezzo sul mercato italiano
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema
Insta360 Luna Ultra integra un sensore da 1 pollice 8K, ottiche Leica e triplo chip IA. Tra schermo OLED rimovibile, workflow I-Log a 10 bit e stabilizzazione a tre assi, analizziamo le doti tecniche di una gimbal camera pensata per i professionisti
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 21-04-2008, 11:46   #1
Albi89
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);
Ricevo però un errore di sintassi su quest'ultima riga.
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
Albi89 è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2008, 12:38   #2
marra11mg
Member
 
Iscritto dal: Feb 2008
Messaggi: 32
Quote:
Prova *prova_ptr = new Prova[x](y);
Questa sintassi è sbagliata, o per lo meno il mio compilatore non la accetta.


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 12:40.
marra11mg è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2008, 13:08   #3
marco.r
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
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2008, 13:11   #4
Albi89
Senior Member
 
Iscritto dal: May 2004
Città: Napoli
Messaggi: 773
Quote:
Originariamente inviato da marra11mg Guarda i messaggi
Questa sintassi è sbagliata, o per lo meno il mio compilatore non la accetta.


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
Sì, questa potrebbe essere sicuramente una soluzione, ma ancora non fa esattamente al mio caso, perchè sto cercando di aggiungere una nuova funzionalità ad un programma che avevo già scritto, quindi così facendo sarei costretto a fare qualche modifica qua e là al codice di tutta la classe...
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 13:14.
Albi89 è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2008, 14:48   #5
71104
Bannato
 
L'Avatar di 71104
 
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)
	{
		...
	}

};
71104 è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2008, 15:05   #6
Tommo
Senior Member
 
L'Avatar di Tommo
 
Iscritto dal: Feb 2006
Messaggi: 1304
Quote:
Originariamente inviato da 71104 Guarda i messaggi
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)
	{
		...
	}

};
Scusa, ma credo che questo non funzioni
Chiamare un costruttore, non dovrebbe creare un nuovo oggetto?
__________________
*ToMmO*

devlog | twitter

Ultima modifica di Tommo : 21-04-2008 alle 15:15.
Tommo è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2008, 15:40   #7
Albi89
Senior Member
 
Iscritto dal: May 2004
Città: Napoli
Messaggi: 773
Quote:
Originariamente inviato da 71104 Guarda i messaggi
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)
	{
		...
	}

};
Non credo che risolva il mio problema... così facendo, con
Codice:
Prova *prova_ptr = new Prova[x];
vengono comunque creati x oggetti Prova invocando il costruttore di default, mentre io vorrei poter passare come argomento una seconda variabile
__________________
If builders built buildings the way programmers wrote programs, then the first woodpecker that came along would destroy civilization.
--Gerald Weinberg
Albi89 è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2008, 15:53   #8
fek
Senior Member
 
L'Avatar di fek
 
Iscritto dal: Oct 2002
Città: San Jose, California
Messaggi: 11794
Quote:
Originariamente inviato da Albi89 Guarda i messaggi
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);
Ricevo però un errore di sintassi su quest'ultima riga.
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 =)

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;
Il costruttore di default di C fa volutamente nulla. Non e' una tecnica che ti consiglio se non sai esattamente quello che stai facendo.
fek è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2008, 16:06   #9
Albi89
Senior Member
 
Iscritto dal: May 2004
Città: Napoli
Messaggi: 773
Quote:
Originariamente inviato da fek Guarda i messaggi
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;
Il costruttore di default di C fa volutamente nulla. Non e' una tecnica che ti consiglio se non sai esattamente quello che stai facendo.
Mh va decisamente contro quella che era la mia idea originaria (visto che intendevo mantenere il codice molto più semplice e conciso)... penso proprio che adotterò un'altra strategia... non credevo fosse impossibile ralizzare quello che volevo fare usando solo l'operatore new
__________________
If builders built buildings the way programmers wrote programs, then the first woodpecker that came along would destroy civilization.
--Gerald Weinberg
Albi89 è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2008, 22:56   #10
marco.r
Senior Member
 
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
Quote:
Originariamente inviato da 71104 Guarda i messaggi
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)
	{
		...
	}

};


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 22:58.
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2008, 09:27   #11
marra11mg
Member
 
Iscritto dal: Feb 2008
Messaggi: 32
Quote:
Originariamente inviato da Albi89 Guarda i messaggi
Sì, questa potrebbe essere sicuramente una soluzione, ma ancora non fa esattamente al mio caso, perchè sto cercando di aggiungere una nuova funzionalità ad un programma che avevo già scritto, quindi così facendo sarei costretto a fare qualche modifica qua e là al codice di tutta la classe...
Davvero non c'è modo di richiamare un costruttore con argomenti non di default in questi casi?
Perchè dovresti modificare il codice della classe?
Quando esegui questa istruzione:
Codice:
Prova** puntatore = new Prova*[numero_classi];
non fai altro che creare un array di puntatori alla classe, non le classi vere e proprie. Quello lo fai con l'istruzione contenuta all'interno del ciclo for.
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).
marra11mg è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2008, 09:40   #12
Davidino.gbr91
Member
 
L'Avatar di Davidino.gbr91
 
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
Davidino.gbr91 è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2008, 19:13   #13
Albi89
Senior Member
 
Iscritto dal: May 2004
Città: Napoli
Messaggi: 773
Quote:
Originariamente inviato da marra11mg Guarda i messaggi
Perchè dovresti modificare il codice della classe?
Quando esegui questa istruzione:
Codice:
Prova** puntatore = new Prova*[numero_classi];
non fai altro che creare un array di puntatori alla classe, non le classi vere e proprie. Quello lo fai con l'istruzione contenuta all'interno del ciclo for.
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).
Quando l'ho postato era chiaro, poi mi sono accorto di aver scritto al volo "x" e "y" senza spiegare da dove uscissero, quindi ho aggiunto quella riga su x e y scombinando tutto il senso... intendevo smeplicemente segnalare che nell'esempio le definivo in altro luogo, e che x era la lunghezza mentre y il valore con cui intendevo inizializzare gli oggetti.

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
Albi89 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Recensione REDMI Note 17 Pro: il midrange con batteria da 8.340 mAh e ricarica veloce Recensione REDMI Note 17 Pro: il midrange con ba...
Insta360 Luna Ultra: la potenza del sensore da 1 pollice incontra la portabilità estrema Insta360 Luna Ultra: la potenza del sensore da 1...
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
DAZN Full in sconto a partire da 19,99 e...
iPhone 18 Pro disponibile su Amazon a 1....
ECOVACS T90 OMNI a 439€ e T90 MAX OMNI a...
Questa Proscenic è la scopa elett...
Microsoft Defender: falso allarme sull'a...
Aerei in volo e truppe pronte all'assalt...
Usano Claude per hackerare OpenAI: ricer...
RatHat: il nuovo malware Android usa il ...
Domanda di petrolio in calo di 2,5 milio...
Il meglio delle offerte weekend Amazon a...
Dopo oltre 100 anni di tentativi, l'IA d...
Speciale robot aspirapolvere in offerta ...
L'IA sta cancellando i lavori junior? Il...
Debutta Chery Italia: non più sol...
Addio ai dischi? Xbox ci aveva già...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 00:45.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v