PDA

Visualizza la versione completa : [C/C++] Creare un ulteriore oggetto


Puffolott0
15-12-2003, 14:48
Ciao...
Devo fare un programma che funzioni così: quando l'utente clicca col mouse in un punto della mia finestra, devo mettere un oggetto in quel punto...
Ho creato la finestra e so vedere quando l'utente ci clicca sopra. So in che punto clicca e sono in grado di metterci un oggetto a mia scelta, il problema è come CREARE un nuovo oggetto...
Non posso utilizzare un array, perchè dovrei definirlo prima di inserire il primo oggetto, e in quel momento non so quanti oggetti verranno messi nel programma...
Come posso fare? E poi come identifico quell'oggetto se voglio farci delle operazioni?

Grazie...

(Penso che sia necessario usare NEW e DELETE, ma non so usarli bene :bhò: )

Leevon
15-12-2003, 16:34
Mi pare che la tua intuizione sia giusta.... Per allocare un nuovo oggetto in fase di esecuzione devi crearti un puntatore ad esso e utilizzare new in questo modo:

ptr_oggetto=new Classe_oggetto(eventuale costruttore);

se la ia memoria nn inganna dovrebbe essere giusto....

Puffolott0
15-12-2003, 16:47
Originariamente inviato da Leevon
Mi pare che la tua intuizione sia giusta.... Per allocare un nuovo oggetto in fase di esecuzione devi crearti un puntatore ad esso e utilizzare new in questo modo:

ptr_oggetto=new Classe_oggetto(eventuale costruttore);

se la ia memoria nn inganna dovrebbe essere giusto.... Avevo pensato che si facesse così...
Il problema è: come identifico quell'oggetto?
Voglio dire... Si chiamano tutti 'ptr_oggetto'... E se io volessi compiere dei calcoli su una proprietà degli oggetti?

se avessi un'array di oggetti farei:

for (int i = 0; i < lunghezzaarray; i++) {
sommax = ogetto[i].x;
}
Ma lì non ho un array, nè posso inizializzarne uno poichè dovrei farlo prima di creare il primo oggetto, ma in quel momento non saprei che dimensione dargli :bhò:

Leevon
15-12-2003, 16:59
Se puoi allocare dinamicamente un oggetto, puoi farlo anche per un array di oggetti....Pensaci un pò...

Per accedere ad un metodo di un oggetto allocato dinamicamente si utilizza la stessa sintassi che si usa per i record allocati dinamicamente:

ptr_oggetto->metodo();

Puffolott0
15-12-2003, 17:25
Originariamente inviato da Leevon
Se puoi allocare dinamicamente un oggetto, puoi farlo anche per un array di oggetti....Pensaci un pò...
Già... Ma dovrei fare così ogni volta che viene creato un nuovo oggetto:
creare con NEW un nuovo array grosso quanto il precedente + 1;
spostare tutti gli elementi del vecchio array in quello nuovo;
deallocare con DELETE il vecchio array che non serve più;
inserire il nuovo oggetto nell'ultimo posto del nuovo array
giusto? Non si può fare qualcosa di più semplice? (intendo più semplice per il computer... Questo richiede di fare almeno tre operazioni non necessarie...)



Ho trovato cercando con google un programma che funziona così:
all'inizio, nel main viene creato un ptr_oggetto di base, con tutte le proprietà su NULL o su 0.
nella classe dell'oggetto ci sono due puntatori agli oggetti della classe stessi, chiamati NEXT e PREV.
E la classe è fatta così (ehm... a dire la verità è una struttura, non una classe... Era un codice in c, ma è uguale...):

struct Classe_oggetto
{
Classe_oggetto *PREV, *NEXT;
int x;
};

Quando creo un nuovo oggetto viene richiamata la funzione NEWOBJ (passandogli come parametro ptr_oggetto) che è fatta così:

void NEWOBJ (Classe_oggetto ptr_oggetto)
{
while (ptr_oggetto->next != NULL) ptr_oggetto=ptr_oggetto->NEXT;
ptr_oggetto->NEXT=new Classe_oggetto();
ptr_oggetto->NEXT->PREV=ptr_oggetto;
ptr_oggetto->PREV->NEXT=ptr_oggetto;
ptr_oggetto->NEXT->NEXT=ptr_oggetto;
ptr_oggetto->NEXT->x=0;
}

e quando c'è bisogno di fare un'operazione sulla X di tutti gli oggetti si usa questa funzione:

int SOMMAX (Classe_oggetto ptr_oggetto)
{
int somma;
while (ptr_oggetto->next != NULL) somma=ptr_oggetto->NEXT
return somma;
}


ehm... Dite che è perfetto o ci può essere di meglio?

iguana13
15-12-2003, 17:51
Se sai usare la STL, potresti usare il container vector e ci metti dentro tutti gli oggetti.

Se non sai usarla, ti mostriamo noi :D

Puffolott0
15-12-2003, 17:58
Mostratemi voi, allora :D
Viene un programma migliore usando quella-cosa-lì al posto di ciò che ho proposto?

Leevon
15-12-2003, 18:04
Mi si perdoni l'ignoranza, ma non conosco queste STL...Io sono di quelli che le librerie se le scrivono da soli(W la programmazione a basso livello!!).... Sicuramente usare queste STL è più semplice e ti conviene, ma se vuoi imparare ti consiglio di provare ad implementarti una lista che contenga il buffer degli oggetti...
A te la scelta!

iguana13
15-12-2003, 18:37
Ecco un esempio che usa la STL (Standard Template Library):



#include <iostream>

#include <vector>

using namespace std;


//Una classe per provare
class Classe
{
int x, y;
public:
Classe() {
x=0;
y=0;
}
Classe(int a, int b) {
x=a;
y=b;
}
int Classe::getx() {
return x;
}
int Classe::gety() {
return y;
}
~Classe() {
}
};

void main()
{
//Dichiarazione del vettore oggetti
vector<Classe> oggetti(0);

//Aggiuge 10 oggetti (in questo caso solo interi)
int i;
for (i=0; i<10;i++)
{
oggetti.push_back(Classe(i,i*2));
}
//Da notare che si ridimensiona da solo!

//Aggiungo altri oggetti
for(;i<20;i++)
oggetti.push_back(Classe(i*3,i*5));

cout << "Numero oggetti: " << oggetti.size() << endl;

for(i=0;i<(int)oggetti.size(); i++)
{
cout << i << endl;
}

}


La STL è una delle parti + importanti e utili inserite nello standard C++. E fa risparmiare molto lavoro.


Se nn capisci qualcosa ,chiedi pure! :ciauz:

Puffolott0
15-12-2003, 19:44
Ah... I vettori :p
Sì, ho capito che sono... Li ho usati col Java... Che brutti ricordi che ho di loro :( e del Java in generale :(:(
Sono comodi... Ma in questo caso... Mi danno un reale vantaggio?
Voglio dire... Che cambia tra usare i vettori o il codice che ho trovato su google? :)
E' la stessa cosa fatta in due modi diversi, ma l'ho già realizzata nell'altro modo... :)

I vettori sono solo del C++ o anche nel C?

Loading