Original geschrieben von axeljaeger
OK, also ein eigener Typ.
Besser, weil skalierbarer, ist du nimmst einen String (hat ja auch anda_skoa ein paar Posts vorher vorgeschlagen).
Code:
#include <string>
#include <map>
#include <algorithm>
#include <iostream>
class Base {
public:
virtual ~Base() {}
virtual void foo() { std::cout << "Base\n"; }
};
class Sub1 : public Base {
public:
virtual void foo() { std::cout << "Sub1\n"; }
};
class Sub2 : public Base {
const std::string name_;
public:
Sub2(const std::string& name) : name_(name) {}
virtual void foo() { std::cout << "Sub2 " << this->name_ << '\n'; }
};
Base* createBase() {
return new Base();
}
Base* createSub1() {
return new Sub1();
}
Base* createSub2() {
return new Sub2("bar");
}
class Factory
{
typedef Base* (*PFUN)();
typedef std::map<std::string,PFUN> OBJLIST;
typedef OBJLIST::iterator OITER;
OBJLIST objList;
public:
void registerObj(const std::string& name,PFUN pfun)
{
this->objList.insert(std::make_pair(name,pfun));
}
Base* create(const std::string& name)
{
OITER iter = this->objList.find(name);
if(iter != this->objList.end())
{
return (iter->second)();
}
return 0;
}
};
int main()
{
Factory fac;
fac.registerObj("Base",createBase);
fac.registerObj("Sub1",createSub1);
fac.registerObj("Sub2",createSub2);
Base *pB = fac.create("Sub2");
Base *pB1 = fac.create("Base");
pB->foo();
pB1->foo();
}
Sowas ähnliches wie das Argument der sizeof-Funktion
sizeof ist keine Funktion, es ist ein Operator.
Lesezeichen