Esercizio STL vector

di il
4 risposte

Esercizio STL vector

Salve a tutti, ho difficoltà in questo esercizio, ho provato a vedere quali metodi di std::vector utilizzare, ma non sono per niente sicuro sul loro utilizzo e se possono fare al caso mio e volevo sapere se sono sulla strada giusta.
grazie a chi risponderà

devo usare std::vector come contenitore delle armi.

Devo completare la classe con i metodi :

-addWeapon(Weapon*w); // aggiunge un arma all'inventario
Non so se ho fatto bene ad usare quel metodo

-~Inventory(); // rimuove tutti gli elementi dell'inventario
ho fatto un ciclo for con l'iteratore che me lo scansione tutto e mi cancella gli elementi


- void removeWeapon(int i) // rimuove l'i-esima arma dell'inventario
Ho usato erase ma non sono sicuro sia la soluzione giusta

-Weapon *getWeapon(int i)//prende l'i-esima arma dell'inventario
ho trovato il metodo operator[]

-int useWeapon(int i); // usa l'i-esima arma dell'inventario e rende il valore del suo metodo usando useWeapon, non ho riportato le varie Weapon perché sarebbe stato troppo confusionario ma ci sono
non saprei come farlo questo metodo al momento


-int getNumWeapons();// riporta il numero di elementi dell'inventario
penso il metodo sia giusto solo che mi rende un unsigned long e a me serve un int


FILE .h

#include <vector>
#include "Weapon.h"

class Inventory {
public:
	Inventory();
	virtual ~Inventory(); // TODO implement

	void addWeapon(Weapon* w); // TODO implement
	void removeWeapon(int i); // TODO implement
	Weapon* getWeapon(int i); // TODO implement
	int useWeapon(int i); // TODO implement

	int getNumWeapons(); // TODO implement

private:
	// TODO add STL vector to hold the weapons
std::vector<Weapon*> wContainer; //vector di weapon stl container
};

FILE C++

#include "Inventory.h"
#include <algorithm>

Inventory::Inventory()  {
	// TODO bonus activity: preallocate 5 elements
}

Inventory::~Inventory() {
	// TODO implement
	std::vector<Weapon*>::iterator i;
	for(i = wContainer.begin(); i != wContainer.end();i++){
	    delete *i;
	    *i = 0;
	}
	//wContainer.clear();
}

void Inventory::addWeapon(Weapon* w) {
	// TODO implement
	wContainer.push_back(w);
}

void Inventory::removeWeapon(int i) {
	// TODO implement
	// uso erase
	wContainer.erase(wContainer.begin()+i);
}

Weapon* Inventory::getWeapon(int i) {
	// TODO implement
	return wContainer.operator[](i);
}

int Inventory::useWeapon(int i) {
	// TODO implement

    wContainer.operator[](i);
	return i;
}

int Inventory::getNumWeapons() {
	// TODO implement
    	int numero;
	numero = wContainer.size();
	return numero;
}

4 Risposte

  • Re: Esercizio STL vector

    Una curiosità, se le tue difficoltà riguardano l'utilizzo della classe vector in generale, non sarebbe meglio tradurre i tuoi dubbi in codice più accessibile, in modo anche da aumentare le probabilità che qualcuno risponda? Intendo per esempio sostituire gli oggetti Weapon con semplici int e ricondurre il tutto ad un unico file!
    Alla fine poi quando i tuoi dubbi saranno dissipati potrai spostare autonomamente le conoscenze acquisite al caso specifico di tuo interesse.
  • Re: Esercizio STL vector

    Sono riuscito a chiarirmi diversi dubbi provando e riprovando e ora mi torna tutto, tranne il metodo seguente:
    
    void Inventory::removeWeapon(int i) {
    	wContainer.erase(wContainer.begin()+i);
    }
    
    funziona e passa i test ma trova un leak di memoria a quanto pare non libera la memoria, come posso fare?
    grazie in anticipo
  • Re: Esercizio STL vector

    Devi liberare l'elemento prima di eliminarlo dal vector.
    
    void Inventory::removeWeapon(int i) {
       delete wContainer.at(i); // eccezione se i non è nel range del vector [0,n)
        wContainer.erase(wContainer.begin()+i);
    }
    
    Tra l'altro la sintassi qui usata:
    
    Weapon* Inventory::getWeapon(int i) {
       // TODO implement
       return wContainer.operator[](i);
    }
    
    pur essendo formalmente corretta è parecchio scomoda.
    meglio:
    
    Weapon* Inventory::getWeapon(int i) {
       // TODO implement
       return wContainer[i];
    }
    
    tuttavia dato che potenzialmente l'indice i può non essere contenuto nel range [0, n) del vector è consigliabile usare:
    
    Weapon* Inventory::getWeapon(int i) {
       // TODO implement
       return wContainer.at(i); // eccezione se i non è nel range del vector [0,n)
    }
    
  • Re: Esercizio STL vector

    Grazie mille! avevo capito che andava eliminato l'oggetto, ma non riuscivo a capire quale metodo usare, ora torna e non mi dà errori.
    davvero molto chiaro, di nuovo grazie.
Devi accedere o registrarti per scrivere nel forum
4 risposte