2009-06-20 9 views
7

Mi piacerebbe generare un numero di oggetti (in C++) in base alla quantità/numero che l'utente inserisce.Come generare nomi di oggetti dinamici C++?

Ora ho sentito da qualche parte che deve essere fatto utilizzando i trucchi del puntatore, creando un puntatore a un array del tipo di oggetto richiesto, e quindi aumentando dinamicamente la dimensione della matrice (in fase di esecuzione).

non v'è una soluzione di utilizzare direttamente nomi come Object1, Object2 ..... ObjectX invece di aver Classname * Object [] e quindi utilizzando l'indice dell'array per ottenere l'oggetto?

In entrambi i casi, sarebbe bello se qualcuno potesse chiarire il problema.

Grazie!

+0

È quasi impossibile capire cosa intendi per la domanda. Stai parlando di un contenitore di lunghezza variabile? –

+0

Ah. Cosa ha detto! –

risposta

6

Finora nessuno ha spiegato perché il tuo pensiero è difettoso. C++ è un linguaggio compilato, e fa di tutto per trasformare il programma sorgente in un codice macchina efficiente. Per questo motivo, i nomi che date delle variabili sono disponibili per il programma solo al momento della compilazione, quando lo si trasforma da sorgente in un file eseguibile. Successivamente, quando si desidera creare oggetti dinamicamente, questi tipi di informazioni non sono più disponibili. Il programma conosce solo gli indirizzi macchina in cui si trovano gli operandi per le istruzioni della macchina.

+0

Grazie per la spiegazione, esattamente ciò di cui avevo bisogno (per capire). Saluti ! –

8

Se si desidera un array di dimensioni dinamiche, utilizzare std :: vector. Non sarai in grado di ridimensionare un array integrato. Se si vuole essere in grado di ottenere un oggetto in base al nome della stringa, quindi si dovrebbe utilizzare std :: map, ha un indicizzatore:

std::map<string, Classname> myMap; 
myMap["Object1"] = Classname(); 
Classname newClassname = myMap["Object1"]; 
+0

+1 per compensare l'ingiustificabile down-vote: una mappa è un buon approccio se si desidera gestire gli oggetti per nome stringa anziché per numero. –

+0

Grazie per l'idea riguardante le mappe. Cercherò anche di dare un'occhiata più approfondita. –

+0

So che questo è post molto vecchio, e probabilmente non dovrei commentare questo, ma non ho potuto fare a meno di notare che in questo esempio, devi ancora usare un nome specifico dell'oggetto (newClassname). Che senso ha usare le mappe? È possibile usare 'mapname [chiave]' come l'oggetto stesso, senza mai nominarlo esplicitamente, come questo 'mapname [chiave] -> somefunc()' assumendo che la dichiarazione fosse 'std :: map mapname'? Sto cercando di capire perché la mappa è utile se una voce della mappa non può essere utilizzata come nome generato dinamicamente? –

3

No, non c'è. Inoltre, non è necessario; utilizzare std::vector.

3

Quando ho iniziato a programmare 9 anni fa mi sono posto la stessa domanda. La risposta è: non puoi.

Si può effettivamente usare un array e ridimensionarlo dinamicamente, tuttavia usare un vettore stl è molto più semplice (una volta che si impara a usarlo).

+0

9 anni fa dici :) che mi fa aspettare un bel po ', hehe! apprezzo davvero la risposta! –

3

Non è possibile farlo perché il C++ non ha un "ambiente" (reflection) in cui possono risiedere le variabili (e i metadati). Inoltre, in C++ tutti i nomi delle variabili sono spariti quando il codice è compilato.

Un modo per ottenere l'effetto desiderato è utilizzare uno Map in cui le chiavi sono stringhe.

+0

Grazie ancora per l'idea con le mappe.Di sicuro darò un'occhiata. –