Convertire in C++ vettore bidimensionale da Java

di il
11 risposte

Convertire in C++ vettore bidimensionale da Java

Salve a tutta la comunity, vorrei sapere come posso convertire in C++ le seguenti righe scritte in Java:

public class Entity {
   public int worldX;
}

public final int maxMap = 10;
public Entity obj[][] = new Entity[maxMap][20];

Per la prima parte, uso:

class Entity 
{
public:
	// coordinate mondo: la mappa del mondo
	int worldX = 0;
};
const int maxMap = 10;

come devo scrivere invece l'ultima parte ?

11 Risposte

  • Re: Convertire in C++ vettore bidimensionale da Java

    Nello stesso modo, perché?

    Ti rendi conti, si, che Java è un linguaggio con gestione della memoria automatica mentre il C++ ha la gestione della memoria (semi) manuale? 

    E' la PRIMA E PIU' IMPORTANTE COSA DA IMPARARE, per programmare in  C/C++. 

  • Re: Convertire in C++ vettore bidimensionale da Java

    Caro @migliorabile, certo che lo so, infatti quello che vorrei sapere è come ottenere una cosa del genere. In pratica ho un vettore di puntatori alla classe Entity (da cui derivano altre classi) che costituiscono un insieme di oggetti presenti in una mappa di un video gioco 2D, che ho scritto in C++17. Ora devo creare diverse mappe di gioco aventi ogniuna un isieme di oggetti (la gran parte di questi sono sempre gli stessi della prima mappa). In Java si è fatta una cosa simile, usando la riga di codice che ho riportato all'inizio.

    La mia domanda dunque, come posso fare in C++17 una cosa simile.

  • Re: Convertire in C++ vettore bidimensionale da Java

    Caro @migliorabile, certo che lo so, infatti quello che vorrei sapere è come ottenere una cosa del genere. In pratica ho un vettore di puntatori alla classe Entity (da cui derivano altre classi) che costituiscono un insieme di oggetti presenti in una mappa di un video gioco 2D, che ho scritto in C++17. Ora devo creare diverse mappe di gioco aventi ogniuna un isieme di oggetti (la gran parte di questi sono sempre gli stessi della prima mappa). In Java si è fatta una cosa simile, usando la riga di codice che ho riportato all'inizio.

    La mia domanda dunque, come posso fare in C++17 una cosa simile.

  • Re: Convertire in C++ vettore bidimensionale da Java

    Dovresti dichiarare una matrice di puntatori a Entity, e per ognuno di questi fare una new Entity (o new ClasseDerivata) all'avvio o durante il gioco.

  • Re: Convertire in C++ vettore bidimensionale da Java

    Scusa @Alexv, ma non capisco dove c'è il riferimento alla mappa, secondo il tuo ragionamento… . Io ho già una mappa (ha indice 0 nel vettore delle mappe o meglio nel primo indice della matrice che devo creare obj[ ][ ] secondo Java), a quel indice corrisponde (vedi secondo indice di  obj[ ][ ] secondo Java) un puntatore all'istanza della classe Entity di un entità. Ora dovrò, secondo questo schema, creare un altro record avente come primo indice sempre la prima mappa (quindi obj[0][ ] secondo Java) ma come secondo indice un nuovo puntatore all'istanza della classe Entity di una nuova entità (per esempio un altro oggetto, o un nuovo personaggio, tutti derivano da Entity). Quando poi ho esaurito tutti i puntatori all'istanza della classe Entity per quella mappa (quindi obj[0][ ] secondo Java), devo passare alla seconda mappa (quindi obj[1][ ] secondo Java) che avrà a sua volta un elenco di puntatori all'istanza della classe Entity presenti in quella mappa.

    Quindi come fare questa nuova matrice (obj[ ][ ] secondo Java) in C++17 ?

    Spero di essere stato abbastanza chiaro, diversamente fammi sapere… :-) scusa la lungaggine.

  • Re: Convertire in C++ vettore bidimensionale da Java

    24/06/2024 - giorgik63 ha scritto:


    quello che vorrei sapere è come ottenere una cosa del genere. 

    1. In pratica ho un vettore di puntatori alla classe Entity (da cui derivano altre classi) che costituiscono un insieme di oggetti presenti in una 
    2. mappa di un video gioco 2D, che ho scritto in C++17. Ora devo creare diverse mappe di gioco aventi ogniuna un isieme di oggetti (la gran parte di questi sono sempre gli stessi della prima mappa). 
    3. In Java si è fatta una cosa simile, usando la riga di codice che ho riportato all'inizio.

    La mia domanda dunque, come posso fare in C++17 una cosa simile.

    @giorgik63, QUALE cosa del genere?

    1. La gestione dei puntatori? 
    2. la gestione della memoria?
    3. il fatto che in Java quando dichiari un oggetto stai implicitamente usando un puntatore mentre in C++ devi usare DIRETTAMENTE i puntarori?
    4. la gestione di un vettore di vettori dove ogni elemento di questo ultimo puo' essere una classe o una classe derivata?

    .

    Se e' il punto 4, caro mio, la tua comprensione del C++ e' a MENO INFINITO, nemmeno a zero.

    Java e C++ si assomigliano come sintassi, MA conoscere la sintassi di un linguaggio di programmazione NON VUOL DIRE saper programmare in quel linguaggio.

    Per rispondere alla tua domanda serve un capitolo, o anche piu' di un capitolo, di un libro sul C++

    Comunque, potrebbe essere una cosa del genere:

    std::vector<
       std::vector<
          std::smart_ptr<Entity>
       >
    > obj;

    o peggio

    std::smart_ptr<
       std::vector<
          std::smart_ptr<
             std::vector<
                std::smart_ptr<Entity>
             >
          >
       >
    > obj;

    e questo semplice esempio si porta dietro i capitoli su

    1. puntatori
    2. standard template library
    3. template programming
    4. container stl
    5. smart pointers
    6. ereditarieta'

    .

    E non ultimo: come implementare il Garbage Collector in C++, dove ci sono almeno 2 libri di testo TOSTI sull'argomento.

    Buona fortuna

  • Re: Convertire in C++ vettore bidimensionale da Java

    Hai bisogno di allocare 20 entità per mappa, per un totale di 200 entità, e vuoi usare l'entità y della mappa x con obj[x][y] ? Ti serve appunto l'array bidimensionale, che puoi dichiarare nel modo classico (simile a come hai fatto in java), oppure come un vector di vector, come ha fatto migliorabile.

    Una volta dichiarato l'array, non serve popolarlo: dentro ci sono già dei puntatori, dei puntatori che però non puntano a niente. Per ognuno di questi devi allocare memoria costruendo un oggetto Entity o una sua sottoclasse.

    Se usi il vector, che può essere ridimensionato a piacere, hai il problema delle deallocazioni (distruggendo il puntatore non distruggi anche l'oggetto puntato) per questo migliorabile ha usato gli smart pointer; ma per usa cosa semplice è meglio il classico array bidimensionale statico.

    Quello che però non capisco (non capiamo) è se hai un problema con la sintassi degli array, o se non conosci l'allocazione di memoria e l'uso dei puntatori in C++. Sapresti creare una sola entità, con un solo puntatore?

  • Re: Convertire in C++ vettore bidimensionale da Java

    Grazie @Alexv. Sì, non ho scritto tutto il codice che uso.

    int i = 0;
    std::vector<Entity*> obj;
    Entity* tmp = new Entity();
    obj.push_back(tmp);
    obj.at(i)->worldX = 25;
    i++;
    tmp = new Entity();
    obj.push_back(tmp);
    obj.at(i)->worldX = 26;
    i++;
    tmp = new Entity();
    obj.push_back(tmp);
    obj.at(i)->worldX = 27;
    
  • Re: Convertire in C++ vettore bidimensionale da Java

    Bene, allora non ti resta che creare il vettore delle mappe e copiarci dentro i vari vettori di oggetti

    std::vector<std::vector<Entity*>> maps;
    maps.push_back(obj);

    Per evitare lunghe copie di interi vettori, puoi usare la move

    #include <utility>
    maps.push_back(std::move(obj)); //Attenzione! dopo questa operazione obj sarà un vettore vuoto, che puoi riutilizzare

    Se vuoi usare nomi di tipi più accessibili, li puoi rinominare, es:

    using EntityCollection = std::vector<Entity*>;
    using World = std::vector<EntityCollection>;

    Non ti dimenticare i delete per deallocare quando viene il momento. Per questo in seguito ti conviene imparare a usare gli smart pointer.

  • Re: Convertire in C++ vettore bidimensionale da Java

    Grazie @Alexv, sei stato molto gentile ed educato.

  • Re: Convertire in C++ vettore bidimensionale da Java

    Di niente :) 

Devi accedere o registrarti per scrivere nel forum
11 risposte