Archived

This topic is now archived and is closed to further replies.

ZoomBoy

From MFC to STL

Recommended Posts

I'm programming a RPG and I'm updating my data handling My major effort had used the MFC collections - mainly CPtrList and used a Base class that I operated on
    
class BaseObj
{
public:
	~BaseObj() {};
	char KeyName[40];
	int  KeyCode;
	char Key2ndName[40];
	int  KeySourceCode;
	int  UPriority;
	int  ObjType;
	int  nID;
};

// And then derived things like 


class InventoryItem : public BaseObj
{
protected:
	int		ItemQuantity;
	double	ItemPrice;
	double	ItemLbs_type;
	double	ItemOunces; 
	....
};

// and 


class Actor : public totplist
{
public:
	char  Home[20];
	short careerFlag;
    	char  family_occupation[20];
	short convocation;
    	short gender, species, bdate[2], sunsign[2];
	short basicstats[14];
	....
	CPtrList *pInventoryList;
	CPtrList *pWeaponList;
	....
};

// And used functions like:


SortByKeySourceCode(CPtrList *pTopList)
SortByKeyCode(CPtrList *pTopList)
SortByUPriority(CPtrList *pTopList)
SortByUPriorityReverse(CPtrList *pTopList)
SortByKeyName(CPtrList *pTopList)
SortByKey2ndName(CPtrList *pTopList)
  
Now I want to move all this into STL Question 1) Pretty basic but how do I address a list across different cpp files? in PCEdit.cpp I would have std::list WeaponList; How would I access it in another file? Would I use a reference in an .h file? Question 2) If I have class Actor { std::list WeaponList; std::list SpellList; std::list ItemList; short gender, species, bdate[2], sunsign[2]; short basicstats[14]; int numWeapons, numSpells, numItems; }; Actor MyGuy; I can't just fwrite(File_Pointer, MyGuy, 1); Are there any special function that allow you to save lists to file? ZoomBoy Developing a iso-tile 2D RPG with skills, weapons, and adventure. See my old Hex-Tile RPG GAME, character editor, diary, 3D Art resources at Check out my web-site [/source] [edited by - ZoomBoy on May 28, 2003 11:53:52 PM]

Share this post


Link to post
Share on other sites
You have to tell the list what it's going to hold.
You access the variable you create from a template just like any other, except you want to make a typedef for the list so you can find the iterator type later.

You'll want to write a function that take a moniker and creates an object from it - either an ID or a name.
e.g.

      
typedef std::list<InventoryItem*> InventoryItemList;
InventoryItemList list_of_stuff;

struct BaseObj
{
//Most base classes should have a virtual dtor

virtual ~BaseObj(){}
};


struct InventoryItem : BaseObj
{
virtual ~InventoryItem(){}
virtual ItemID GetID()=0;
virtual WriteToDisk(FILE*)=0;
virtual ReadFromDisk(FILE*)=0;
};


enum ItemID
{
SwordID,
//etc...

};
InventoryItem* CreateItem(ItemID item_id)
{
//This isn't the best way, but will get you started

if(item_id == SwordID)
return new Sword;
//etc...

};


//Write a range of items out to disk

template<class FI>
void WriteItems(FILE* hfile, FI begin, FI end, size_t n)
{
//Size first, always first

fwrite(hfile, n, sizeof(size_t));
FI it = begin;
for(; it!=end; ++it)
{
InventoryItem* item = *it;
ItemID id = item->GetID();
fwrite(&id, sizeof(ItemID), 1, hfile);
item->WriteToDisk(hfile);
}
}
//Use like this:

FILE* save;
//...

WriteItems(save, WeaponList.begin(), WeaponList.end(), WeaponList.size());



//II means insertion iterator

template<class II>
void ReadItems(FILE* hfile, II ii)
{
size_t n;
fread(&n, sizeof(size_t), 1, hfile);
for(size_t i=0; i<n; ++i)
{
ItemID id;
fread(&id, sizeof(ItemID), 1, hfile);
InventoryItem* item = CreateItem(id);
item->ReadFromDisk(hfile);
*ii = item;
++ii;
}
}
FILE* restore;
//...

ReadItems(restore, std::back_inserter(WeaponList));


This is a mish-mash of template and OO code... good luck


[edited by - Magmai Kai Holmlor on May 28, 2003 11:50:19 PM]

Share this post


Link to post
Share on other sites
Ooops, I had to re-redit my response
Most of my questions ended in the source section
so it''s not as clear as I''d like.

Share this post


Link to post
Share on other sites