Page 1 of 1

Using class object member variables based on other members

Posted: Sat Apr 03, 2010 11:33 pm
by TheThirdL3g
I need to search through a class to find the object who's "id" member variable matches a value. This class object's other member variables will be used for a calculation, but only if the "id" equal.

This concept code might help in understanding what I'm trying to do:

Code: Select all

class testClass {
	public:
		int id:
		int diff;
		};
		
void function(int fId) {
	/*
	Checks which object has the member variable "id" equal to the "fId"
	and uses this objects other member variables for a calculation.
	For example lets say there are two objects for testClass. Object one has a diff of 1 and an id of 10. 
	Object two has a diff of 2 and an id of 11. If fId = 10 then the diff value of object one will be used.
	*/
	}
What I tried defiantly didn't work so any help would be really appreciated.

Re: Using class object member variables based on other member it

Posted: Sat Apr 03, 2010 11:49 pm
by XianForce
TheThirdL3g wrote:I need to search through a class to find the object who's "id" member variable matches a value. This class object's other member variables will be used for a calculation, but only if the "id" equal.

This concept code might help in understanding what I'm trying to do:

Code: Select all

class testClass {
	public:
		int id:
		int diff;
		};
		
void function(int fId) {
	/*
	Checks which object has the member variable "id" equal to the "fId"
	and uses this objects other member variables for a calculation.
	For example lets say there are two objects for testClass. Object one has a diff of 1 and an id of 10. 
	Object two has a diff of 2 and an id of 11. If fId = 10 then the diff value of object one will be used.
	*/
	}
What I tried defiantly didn't work so any help would be really appreciated.
Well I'm going to assume that every object has a unique id, and if so, you could create a map of integers and objects, and then loop through them, checking to see which one contains the desired ID.

Re: Using class object member variables based on other member it

Posted: Sun Apr 04, 2010 8:40 am
by Falco Girgis
XianForce wrote:
TheThirdL3g wrote:I need to search through a class to find the object who's "id" member variable matches a value. This class object's other member variables will be used for a calculation, but only if the "id" equal.

This concept code might help in understanding what I'm trying to do:

Code: Select all

class testClass {
	public:
		int id:
		int diff;
		};
		
void function(int fId) {
	/*
	Checks which object has the member variable "id" equal to the "fId"
	and uses this objects other member variables for a calculation.
	For example lets say there are two objects for testClass. Object one has a diff of 1 and an id of 10. 
	Object two has a diff of 2 and an id of 11. If fId = 10 then the diff value of object one will be used.
	*/
	}
What I tried defiantly didn't work so any help would be really appreciated.
Well I'm going to assume that every object has a unique id, and if so, you could create a map of integers and objects, and then loop through them, checking to see which one contains the desired ID.
I wouldn't recommend a map, since it's pretty resource heavy and your objects already have a unique ID (so why associate it outside of itself?).

I would either have a vector/list of all of your objects then iterate through comparing their IDs with the passed fID, OR have a simple array of the objects where their indices directly correspond to their IDs. This is the preferred method, but I'm not sure where your unique IDs are coming from.

Re: Using class object member variables based on other member it

Posted: Sun Apr 04, 2010 11:09 am
by TheThirdL3g
Thanks for the help.
GyroVorbis wrote:This is the preferred method, but I'm not sure where your unique IDs are coming from.
I probably should of put more into the example code. This should explain the id's a little better.

Code: Select all

class testClass {
   public:
      int id;
      int diff;
      static size_t count;
      testClass(int);
      };

size_t armor::count = 0;

testClass::testClass() {
	count++;
	id = 100 + count;
}


Re: Using class object member variables based on other members

Posted: Sun Apr 04, 2010 12:30 pm
by zeid
The code you provide doesnt really show an attempt at the issue. You could put together a simple entity manager class that encapsulates these things:
Also depending on your needs it might be worth making the entity manager a singleton (I will also provide code for a singleton template)
Note I haven't tested this code, so not sure if there are any syntax errors.

Code: Select all

#ifndef _ENTITYMANAGER_H
#define _ENTITYMANAGER_H

#include "Entity.h"
#include <list>
class EntityManager : public Singleton<EntityManager>
{
  friend class Singleton<EntityManager>;
public:
  template<typename T>
  T *create()
  {
     T *e=new T;
     entityList.push_back(e);
     return e;
  }

  Entity *findId(int p_id)
  {
    for(list<Entity*> iter=entityList.begin; iter!=entityList.end; ++iter)
    {
       Entity* e=*iter;
       if(e->id==p_id)
          return e;
    }
    return NULL;
  }

  void destroy(Entity *p_e)
  {
    entityList.remove(p_e);
    delete p_e;
  }
private:
  list<Entity*> entityList;
  EntityManager(){}
  ~EntityManager()
   {
      for(list<Entity*> iter=entityList.begin; iter!=entityList.end; ++iter)
      {
         Entity* e=*iter;
         delete e;
      }
      entityList.clear();
   }
};
#endif
Heres the singleton class I use.

Code: Select all

#ifndef _SINGLETON_H
#define _SINGLETON_H

template<typename T>
class Singleton
{
public:
	static T *instance()
	{
		if(m_singleton==0)
			m_singleton=new T();
		return m_singleton;
	}
	
	void static release()
	{
		delete m_singleton;
		m_singleton = 0;
	}
	
protected:
	Singleton(){}
	virtual ~Singleton(){}
	
private:
	static T *m_singleton;
	Singleton(const Singleton &s);	
};
template<typename T> T *Singleton<T>::m_singleton=0;

#endif
Advantages of this approach...

* You don't have to worry about memory leaks as much as this structure ensures all entities are deleted and the end of the program.
* You can easily itterate through all entities by adding a loop similar to that in findId()
* You can add derived classes of Entity to the entity list, as the create() method is a template function. Hence you could do a call such as entityManager->create<Entity>(); or entityManager->create<DerivedEntity>();

Re: Using class object member variables based on other members

Posted: Wed Apr 07, 2010 12:43 pm
by vargonian
I call homework assigment on this one.

But maybe not.

Just use:

Code: Select all

var matchingObjects = from object in myObjects where object.id == fId select object;
Oh right, this isn't C#. But since this is likely a homework assignment, the teacher is presumably just looking for you to demonstrate an understanding of looping through objects, hence using something like a map will be a red flag for "copied off the internet". What you want is just something like:

Code: Select all

for (int i = 0; i < numObjects; i++)
{
  MyObjectType* object = myObjects[i]; // this assumes it's an array of *pointers* to objects
  if (object.id == fId)
  {
    // do something
    break; // if there's the potential for more than one match, remove this break.
  }
}
(Apologies if this really isn't a homework assignment. In that case, I would probably use something other than just a simple loop, depending on what you're using this for.)

Re: Using class object member variables based on other members

Posted: Wed Apr 07, 2010 12:53 pm
by avansc
binary tree on the ID?

alternatively, and ALOT easier since you dont have to balance it, is sort the array of classes, then just do a binary search on that. should get you some extra points.

Re: Using class object member variables based on other members

Posted: Thu Apr 08, 2010 9:43 am
by avansc
Here is another way of looking at it, not really resource friendly, but a really really good exercise for sorting out things like conditional logic, loops, arrays, and pointers.

Code: Select all


#include <iostream>

using namespace std;

class id
{
public:
	id(int id);
	int i_Id;
};

id::id(int id)
{
	this->i_Id = id;
}

class node
{
public:
	node();
	node(id *data);
	
	node *children[10];
	id *data;
};

node::node()
{
	this->data = NULL;
	for(int a = 0;a < 10;a++)
		this->children[a] = NULL;
}

node::node(id *data)
{
	this->data = data;
	for(int a = 0;a < 10;a++)
		this->children[a] = NULL;
}

void addId(node *root, id *data)
{
	node *temp = root;
	int tid = data->i_Id;
	while(tid > 0)
	{
		if(temp->children[tid%10] == NULL)
			temp->children[tid%10] = new node();
		
		temp = temp->children[tid%10];
		tid /= 10;
	}
	temp->data = data;
}

node *getId(node *root, int id)
{
	node *temp = root;
	while (id > 0)
	{
		if(temp->children[id%10] == NULL)
			return NULL;
		temp = temp->children[id%10];
		id /= 10;
	}
	return temp;
}

int main(int argc, char * const argv[])
{
	node *root = new node();
	addId(root, new id(2345));
	addId(root, new id(2331));
	if(node *temp = getId(root, 2331))
		cout << temp->data->i_Id << endl;
	else
		cout << "No such ID\n";

	return 0;
}