Devon Null wrote:
> Am I re-inventing the wheel here? The wheel I am referring to is the Bag
> class. This encompasses just about everything I need to do AFAIK for now.
> Am I also right in assuming that if I do something like pSword1.reset()
> that it will clean up after itself?
> [code]
> #include "items.h"
> #include <iostream>
> #include <boost/shared_ptr.hpp>
> using namespace std;
> using boost::shared_ptr;
> class Bag
> {
> public:
> Bag( int index_ = 4, float weight = 0.0 );
> void set_bag_name( string bag_name_ ) { bag_name = bag_name_; }
> string get_bag_name() { return bag_name; }
> void set_bag_weight( float weight ) { bag_weight = weight; }
> float get_bag_weight() { return bag_weight; }
> void add_item( shared_ptr<Item> &item, int slot = -1);
> void remove_item( shared_ptr<Item> &item );
> void swap_items( shared_ptr<Item> &item1, shared_ptr<Item> &item2 );
> void list_items();
> private:
> string bag_name;
> float bag_weight;
> vector<shared_ptr<Item> > test_vector;
> vector<shared_ptr<Item> >::iterator bag_iter;
> shared_ptr<Item> null_ptr;
> int index;
> int find_item( shared_ptr<Item> &item );
> };
> Bag::Bag( int index_, float weight ): bag_weight( weight ), index( index_ )
> {
> bag_name = "You need to set a bag name.";
> test_vector.assign( index, null_ptr );
> }
> int Bag::find_item( shared_ptr<Item> &item )
> {
> int slot = 0;
> for( bag_iter = test_vector.begin(); bag_iter < test_vector.end() &&
> *bag_iter != item; bag_iter++ )
> {
> slot++;
> }
> if( bag_iter == test_vector.end() )
> {
> slot = -1;
> }
> return slot;
> }
> void Bag::add_item( shared_ptr<Item> &item, int slot )
> {
> if( slot == -1 )
> {
> int slot_count = 0;
> bag_iter = test_vector.begin();
> while( *bag_iter != null_ptr )
> {
> bag_iter++;
> slot_count++;
> }
> slot = slot_count;
> }
> bag_iter = ( test_vector.begin() + slot );
> if( slot > index )
> {
> cout << "Assignment not allowed, slot exceeds index." << endl;
> }
> else if( slot <= index && *bag_iter != null_ptr )
> {
> cout << "Slot already has an item in it. Use swap_items() or
> replace_item()." << endl;
> }
> else if( slot <= index && *bag_iter == null_ptr )
> {
> test_vector[slot] = item;
> cout << item->get_item_name() << endl;
> }
> else
> {
> cout << "All of the test_vector tests failed." << endl;
> }
> }
> void Bag::remove_item( shared_ptr<Item> &item )
> {
> int slot = find_item( item );
> test_vector[slot] = null_ptr;
> }
> void Bag::swap_items( shared_ptr<Item> &item1, shared_ptr<Item> &item2 )
> {
> int slot1 = 0;
> int slot2 = 0;
> if( &item1 == &item2 )
> { }
> else
> {
> slot1 = find_item( item1 );
> slot2 = find_item( item2 );
> test_vector[slot1] = item2;
> if( slot2 != -1 )
> {
> test_vector[slot2] = item1;
> }
> }
> }
> void Bag::list_items()
> {
> cout << endl;
> int slot = 0;
> for( bag_iter = test_vector.begin(); bag_iter < test_vector.end();
> bag_iter++ )
> {
> cout << "Slot " << slot + 1<< ": ";
> if( *bag_iter == null_ptr )
> {
> cout << "Empty" << endl;
> }
> else
> {
> cout << test_vector[slot]->get_item_name() << endl;
> }
> slot++;
> }
> cout << endl;
> }
> int main()
> {
> shared_ptr<Item> pSword1( new Weapon );
> shared_ptr<Item> pItem1( new Item );
> pSword1->set_item_name( "Wooden Sword" );
> pItem1->set_item_name( "Potion" );
> Bag some_bag;
> cout << "\nAdding..." << endl;
> some_bag.add_item( pSword1 );
> cout << "\nAdding on top of pSword1..." << endl;
> some_bag.add_item( pItem1, 0 );
> cout << "\nAdding..." << endl;
> some_bag.add_item( pItem1 );
> some_bag.list_items();
> cout << "\nRemoving..." << endl;
> some_bag.remove_item( pSword1 );
> some_bag.list_items();
> cout << "\nAdding..." << endl;
> some_bag.add_item( pSword1, 2 );
> some_bag.list_items();
> cout << "\nSwapping..." << endl;
> some_bag.swap_items( pSword1, pItem1 );
> some_bag.list_items();
> some_bag.set_bag_name( "Hip Pouch" );
> cout << "Bag name is " << some_bag.get_bag_name() << endl;
> return 0;
> }
> [/code]
You are doing some work that std::set could do for you. For example,