Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [c++] Oggetti dinamici con Costruttore con argomenti

    Salve gente! Nuovo problema!
    Come si fa con c++ a inizializzare un array di oggetti che hanno costruttori che accettano argomenti?
    Mi spiego meglio:
    Codice funzionante:
    codice:
    int n = variabile;
    int * p = new int[n];
    codice non funzionante:
    codice:
    int n = variabile;
    MioOggetto * p = new MioOggetto(par1,par2,..)[n];
    Avevo trovato questo, ma o non ho capito bene o non fa al caso mio...
    http://forum.html.it/forum/showthread/t-734030.html

    come si può fare senza riscrivere i costruttori della classe?

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Quel thread mi sembra che faccia al tuo caso ... perché parli di riscrivere i costruttori?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Risposta breve: non si può.

    Risposta lunga ma perigliosa: se usi la new creando un array verrà inevitabilmente chiamato solo il costruttore di default (mi pare che nel nuovo standard si possa usare la sintassi dell'initializer list, ma non ne sono sicuro); d'altra parte puoi ottenere un blocco di memoria "grezza" (con una new unsigned char[numeroelementi*sizeof(tipoelementi)]) e richiamare il costruttore di ciascun elemento usando la sintassi del placement new, ma non te lo consiglio (è abbastanza un casino, visto che poi dovrai richiamare i distruttori manualmente).

    Risposta migliore: evita gli array "stile C" e usa std::vector.
    codice:
    #include <vector>
    
    // ...
    
    std::vector vec(n, MioOggetto(par1, par2, par3)); // <-- tutti gli elementi vengono inizializzati come copia dell'istanza passata come parametro
    o, se ogni elemento va inizializzato in maniera diversa:
    codice:
    std::vector vec;
    // non strettamente necessario, ma velocizza preallocando la memoria:
    vec.reserve(n);
    for(int i=0; i<n; i++)
        vec.push_back(MioOggetto(par1(n), par2, par3));
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Per la cronaca, pensavo a qualcosa di questo tipo

    codice:
    #include <iostream>
    
    using namespace std;
    
    class MioOggetto
    {
    private:
    	int x;
    
    public:
    	MioOggetto(int a) {x=a; cout << x << endl;}
    	~MioOggetto() {cout << "dest " << x << endl;}
    };
    
    int main()
    {
    	int n = 100;
    
    	MioOggetto **pp = new MioOggetto *[n];
    
    	for(int i=0; i<n; i++)
    		pp[i] = new MioOggetto(i);
    
    	cin.get();
    
    	for(int i=0; i<n; i++)
    		delete pp[i];
    
    	return 0;
    }
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5

  6. #6
    Originariamente inviato da MItaly
    Risposta migliore: evita gli array "stile C" e usa std::vector.
    Riapro giusto per approfondire un pò...
    perchè è la soluzione migliori e consigli di evitare array stile C che se non erro sarebbe la soluzione di oregon?

  7. #7
    Originariamente inviato da zannas
    Riapro giusto per approfondire un pò...
    perchè è la soluzione migliori e consigli di evitare array stile C che se non erro sarebbe la soluzione di oregon?
    Perché ti rovini il fegato per niente.

    Con array stile C devi portarti dietro separatamente le dimensioni dell'array, ti devi ricordare di deallocarli manualmente (e l'unica maniera sicura per farlo se usi le eccezioni è usare degli smart pointers), non hanno semantica di copia automatica, non si riallocano automaticamente se devi aggiungere altri elementi, ...
    Usando i std::vector hai tutto questo (e molto altro) "gratis" (le performance sono pressoché identiche ad un array raw), e risolvi il tuo problema in una riga con un oggetto semplice da usare invece di doverti gestire manualmente con un array di puntatori.
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    Tutto vero quello che ti ha detto MItaly ... ma vuoi mettere la soddisfazione di passare una notta dietro a qualche "dumb pointer" ... ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  9. #9
    Non potevate essere che più convincenti!

    Queste risposte sono da mettere in evidenza (tipo colorate di giallo e rosso) in un eventuale manuale di programmazione C++ ;D

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.