Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026
In occasione del proprio Architecture Deep Dive 2025 Qualcomm ha mostrato in dettaglio l'architettura della propria prossima generazione di SoC destinati ai notebook Windows for ARM di prossima generazione. Snapdragon X2 Elite si candida, con sistemi in commercio nella prima metà del 2026, a portare nuove soluzioni nel mondo dei notebook sottili con grande autonomia
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice
DJI Mini 5 Pro porta nella serie Mini il primo sensore CMOS da 1 pollice, unendo qualità d'immagine professionale alla portabilità estrema tipica di tutti i prodotti della famiglia. È un drone C0, quindi in un peso estremamente contenuto e che non richiede patentino, propone un gimbal rotabile a 225 gradi, rilevamento ostacoli anche notturno e autonomia fino a 36 minuti. Caratteristiche che rendono il nuovo drone un riferimento per creator e appassionati
ASUS Expertbook PM3: il notebook robusto per le aziende
ASUS Expertbook PM3: il notebook robusto per le aziende
Pensato per le necessità del pubblico d'azienda, ASUS Expertbook PM3 abbina uno chassis particolrmente robusto ad un pannello da 16 pollici di diagonale che avantaggia la produttività personale. Sotto la scocca troviamo un processore AMD Ryzen AI 7 350, che grazie alla certificazione Copilot+ PC permette di sfruttare al meglio l'accelerazione degli ambiti di intelligenza artificiale
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 21-04-2008, 12: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, 13: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 13:40.
marra11mg è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2008, 14: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, 14: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 14:14.
Albi89 è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2008, 15: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, 16: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 16:15.
Tommo è offline   Rispondi citando il messaggio o parte di esso
Old 21-04-2008, 16: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, 16: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, 17: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, 23: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 23:58.
marco.r è offline   Rispondi citando il messaggio o parte di esso
Old 22-04-2008, 10: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, 10: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, 20: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


Qualcomm Snapdragon X2 Elite: l'architettura del SoC per i notebook del 2026 Qualcomm Snapdragon X2 Elite: l'architettura del...
Recensione DJI Mini 5 Pro: il drone C0 ultra-leggero con sensore da 1 pollice Recensione DJI Mini 5 Pro: il drone C0 ultra-leg...
ASUS Expertbook PM3: il notebook robusto per le aziende ASUS Expertbook PM3: il notebook robusto per le ...
Test ride con Gowow Ori: elettrico e off-road vanno incredibilmente d'accordo Test ride con Gowow Ori: elettrico e off-road va...
Recensione OnePlus 15: potenza da vendere e batteria enorme dentro un nuovo design   Recensione OnePlus 15: potenza da vendere e batt...
Superati 13.300 MT/s per DDR5: ad ASUS e...
L’evoluzione dell’IA nelle imprese: la v...
Le storie in evidenza di Instagram torna...
Addio GeForce RTX 5060 e Radeon RX 9060?...
Arriva Hisense Déco TV S5Q, estet...
Aggiornata TOP500, la classifica degli H...
Noctua NH-D15 Chromax.black è rea...
NVIDIA aggiorna DGX Spark: nuovo kernel,...
Con Work IQ, Copilot per Microsoft 365 i...
Azure Cobalt 200: svelata la nuova CPU A...
Intel a tutto tondo: tra processi in ram...
AMD FSR Redstone arriverà ufficia...
L'Olanda 'cede' alla Cina: retromarcia t...
Stagione 1 al via: tutte le novità...
TikTok rafforza trasparenza e benessere ...
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: 21:37.


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