将类本身注册到工厂

时间:2014-02-10 10:26:14

标签: c++ factory

我对工厂模式有疑问。我编写了一个工厂,它有一个名为registerIt的静态函数。它接受类名的字符串和指向任何类的创建者函数的指针。

static void CharacterFactory::registerit(const std::string& classname, Creator creator)
{
   table[classname] = creator;
}

表格是

std::map<std::string, CharacterFactory::Creator> CharacterFactory::table;

创作者

typedef std::auto_ptr<Actor> Type;
typedef Type (*Creator)();

Actor是Base类

类本身具有注册功能。例如“Player”类

static void registerToFactory(){
    CharacterFactory::registerit("Player",&create);
    std::cout<<"player created"<<std::endl;     
    }

我的问题是,如何告诉类将自己注册到静态工厂?如果我在主类中调用registerToFactory,一切正常。但我想更动态地完成它,所以我只需要在新类中更改代码,而不是在我的代码中更改。

以下整个代码:

Factory.h:

#pragma once
#include "Actor.h"
#include <string>
#include<map>
namespace Character{
class Actor;
class CharacterFactory
{

public:
typedef std::auto_ptr<Actor> Type;
typedef Type (*Creator)();

CharacterFactory(void);
~CharacterFactory(void);

Type create(const std::string& classname);
static void registerit(const std::string& classname, Creator creator);

private:
static std::map<std::string, Creator> table;
};
}

演员:

#pragma once
#include<string>
#include"CharacterFactory.h"
#include<iostream>
namespace Character{

class Actor
{
public:

static Actor* create(){std::cout<<"dummy"<<std::endl;return NULL;};
static Actor* create(int dmg){std::cout<<"dummy"<<std::endl;return NULL;};

Actor(void):damage(0),healthPoints(0),lastUpdate(0){};
Actor(int dmg):damage(dmg){};
~Actor(void);

virtual void update(void)=0;
virtual void update(int deltaMillis)=0;

protected:

int lastUpdate;


//Attribute
int healthPoints;
int damage;
//Amor amor;
//Weapon weapon;
//Ai ai;


//Networking

};

}

播放器:

#pragma once
#include "Actor.h"
#include <stdio.h>
#include "CharacterFactory.h"

namespace Character{
#ifndef PLAYER_H
#define PLAYER_H
class Player:public Actor
{
public:

void update(void){};
void update(int deltaMillis){};


static std::auto_ptr<Actor> create(){
    return std::auto_ptr<Actor>(new Player);
}
Player(void);

~Player(void);
static void registerToFactory(){
        CharacterFactory::registerit("Player",&create);
        std::cout<<"player created"<<std::endl;     
    }
inline int getDamage(void){ return damage;};
};
#endif
}

我希望你能帮助我:)。

1 个答案:

答案 0 :(得分:1)

您可以使用构造函数或动态初始化表达式作为静态变量,编译器将确保在调用main()之前运行。