Tak for de hurtige svar!
Bertel Brander din brug af maps gav mig en idé. Jeg har lavet en klasse som man kan putte data members og member functions ind i, efter klassen er lavet. Det er dog et par problemer og det bliver meget rodet. De problemer er umiddelbart kan se er:
-At adressere (hedder det det) tilføjne data members i tilføjne member functions.
-At adressere tilføjne member functions i andre tilføjne member functions.
-At frigive data members, dette er et problem da de er tilføjet som void* pointers (deres type er ukendt) og derfor ikke umiddelbart kan slettes.
Så tror jeg at jeg har taget mine forholdsregler
, her er klassen: (jeg har kommenteret på engelsk - det virker mere naturligt)
#include <map>
using namespace std;
typedef void(*fPtr)();
class DynamicClass
{
public:
//add a new data member
void addDataMember(char* name, void* data)
{
DataMembers[name] = data;
}
//add a new member function
void addMemberFunction(char* name, void(*function)())
{
MemberFunctions[name] = function;
}
//get a data member from its name
void* getDataMember(char* name)
{
map<char*,void*>::iterator iter = DataMembers.find(name);
return iter->second;
}
//get a member function from its name
void (*getMemberFunction(char* name))()
{
map<char*,fPtr>::iterator iter = MemberFunctions.find(name);
return iter->second;
}
//the maps that holds the pointers
map<char*, void*> DataMembers;
map<char*, fPtr> MemberFunctions;
};
Og her er den i aktion
void function(int number)
{
cout<<"Test Function says: "<<number<<endl;
}
int main()
{
//create the class
DynamicClass *dc = new DynamicClass;
//add a data member (a int - value 23)
dc->addDataMember("Alder", new int(23));
//get the added data member out of the class
int Alder = *(int*)dc->getDataMember("Alder");
//print it out
cout<<Alder<<endl;
//add a member function
dc->addMemberFunction("Function", (fPtr)function);
//get the member function out of the class
void (*fTest)(int) = (void(*)(int))dc->getMemberFunction("Function");
//run the member function
fTest(4);
//delete a data member
delete (int*)dc->getDataMember("Alder");
dc->DataMembers.erase("Alder");
return 0;
}
Hvis i har en bedre idé vil jeg meget gerne hører fra jer!
Jeg elsker at pudsle med den slags ting!
Indlæg senest redigeret d. 18.06.2007 01:18 af Bruger #6465