如何动态给类加方法和属性?问个如何给RPG游戏人物加技能的有关问题

怎么动态给类加方法和属性?问个怎么给RPG游戏人物加技能的问题?
怎么动态给类加方法和属性?

比如:   RPG   游戏里人物,学了新技能后,就有该技能的点数,和使用方法。

那像这种类要怎么设计呢?举个例子吧。

------解决方案--------------------
在类里添加个

CObArray 对象.
//----
CObArray m_object;

再调用其函数..
------解决方案--------------------
动态给类加方法和属性?
貌似没这样的吧,怎么说类也要程序员自己写,哪来的动态,顶多继承可以使代码复用,或者说某各类具有良好的可扩展性


楼主的哪个比如根本跟你上面的问题没关系啊
------解决方案--------------------
如果是游戏中开发,
我想这些技能应该都是一个类的 诸多对象

既然是这样,在人物类中来各链表记录这些类就ok了
------解决方案--------------------
比如: RPG 游戏里人物,学了新技能后,就有该技能的点数,和使用方法。

可以是预先定义了属性成员,
根据其值/内容 控制是否具有该技能。
------解决方案--------------------
继承,虚函数等实现多态。
------解决方案--------------------
怎么动态给类加方法和属性?问个怎么给RPG游戏人物加技能的问题?
---
我的想法是系统有个指针来维护技能列表
但不能用链表来实现

比如:
class A
{
public:
////////////////////////////////
其他操作
///////////////

void Show()
{
cout < <this-> PH < <endl;
}
private:
int PH;
};
class B
{
public:
////////////////////////////////
其他操作
///////////////

void Show()
{
cout < <this-> PH < <endl;
}
private:
int PH;
};

template <class T>
class GameMain
{
public:
void ShowPH()
{
T::Show();
}
};
当然这段代码中有很多瑕疵,只是说明一个思路
------解决方案--------------------
我的一个思路:

某一类技能总有名字吧,那么可以参考MFC里的动态创建宏,来实现楼主要的这个功能

然后这个人物的对象里维护一个属性链表,链表里挂着各种动态创建出来的对象(这些对象就是各种技能),就可以了。用各种技能的基类指针指向这些技能对象(别说你不懂多态)

动态创建宏以及其思路,你可以到 《深入浅出MFC》这本书中了解到

我个人感觉用 设计模式中的工厂模式 就可以解决这个问题,不过没有细想过,给楼主一个思路,呵呵。至于工厂模式 楼主可以跑网上搜一把,介绍N多


------解决方案--------------------
你想做的事情可以使用 Decorator的设计模式来完成,把这些技能都设计成一群带有指向下一个技能类指针的类。参照如下:

class absSkill
{
protected:
absSkill* m_pSkill;
public:
virtual void action() = 0; // 定义一个统一的行为接口
};

class TerminateSkill // 终结端
:public absSkill
{
public:
TerminateSkill(){...} // 这个构造函数的参数为空,也就是已经没有下一个技能了
void action(){...}
};

class SkillJump
:public absSkill
{
public
SkillJump(absSkill* pSkill) // 还有下一个技能
:m_pSkill( pSkill ){...}

void action()
{
// ......
// 这个技能要做的东西

m_pSkill-> action(); // 继续调用下一个技能
}
};

class SkillRun
:public absSkill
{
public
SkillJump(absSkill* pSkill) // 还有下一个技能
:m_pSkill( pSkill ){...}

void action()
{
// ......
// 这个技能要做的东西

m_pSkill-> action(); // 继续调用下一个技能
}
};

.......

class CharacterA // 角色信息类
{
private:
absSkill m_pSkillList;
string m_name;

public:
CharacterA( string name, absSkill* pSkill )
:m_name(name),m_pSkillList(pSkill) {...}
}

CharacterA MakeA()
{
return CharacterA( "X-man ", new SkillJump( new SkillRun( new TerminateSkill() ) ) );