动态创建对象

有点类似于java的反射技术

运行时动态获取类型信息(方法与属性)


动态创建对象

动态调用对象的方法

动态操作对象的属性


需要给每个类添加元数据


动态创建对象

对原有的类不做任何更改,只需要增加一个宏就能实现动态创建
注:就是为了消除if else      

可以在初始化静态成员变量前面加上__declspec(selectany) ,这样编译器会自动剔除对该静态成员的重复定义。

Shape.h:

#ifndef _SHAPE_H_
#define _SHAPE_H_
 
class Shape
{
public:
    virtual void Draw() = 0;
    virtual ~Shape() {}
};
 
class Circle : public Shape
{
public:
    void Draw();
    ~Circle();
};
 
class Square : public Shape
{
public:
    void Draw();
    ~Square();
};
 
class Rectangle : public Shape
{
public:
    void Draw();
    ~Rectangle();
};
 
#endif // _SHAPE_H_

Shape.cpp

#include "Shape.h"
#include "DynBase.h"
#include <iostream>
using namespace std;
 
 
void Circle::Draw()
{
    cout<<"Circle::Draw() ..."<<endl;
}
Circle::~Circle()
{
    cout<<"~Circle ..."<<endl;
}
 
void Square::Draw()
{
    cout<<"Square::Draw() ..."<<endl;
}
Square::~Square()
{
    cout<<"~Square ..."<<endl;
}
 
 
 
void Rectangle::Draw()
{
    cout<<"Rectangle::Draw() ..."<<endl;
}
 
Rectangle::~Rectangle()
{
    cout<<"~Rectangle ..."<<endl;
}
 
//利用宏定义进行注册   宏是一个非常强大的工具  利用此方法可以用来注册
REGISTER_CLASS(Circle);
REGISTER_CLASS(Square);
REGISTER_CLASS(Rectangle);

DynBase.h

#ifndef _DYN_BASE_H_
#define _DYN_BASE_H_
//用来绑定字符串和对应的
#include <map>
#include <string>
using namespace std;
 
typedef void* (*CREATE_FUNC)();
 
class DynObjectFactory
{
public:
    //因为是工具类,所以设置为静态函数
    static void* CreateObject(const string& name)
    {
        //CREATE_FUNC是一个函数指针 他的返回值是空指针
        map<string, CREATE_FUNC>::const_iterator it;
        it = mapCls_.find(name);
        if (it == mapCls_.end())
            return 0;
        else
            return it->second();
 
    }
 
    static void Register(const string& name, CREATE_FUNC func)
    {
        //是可以访问静态成员私有变量的
        mapCls_[name] = func;
    }
private:
    static map<string, CREATE_FUNC> mapCls_;
};
 
// g++
// __attribute ((weak))
//静态成员初始化一次   通过假如关键字来进行实现
__declspec(selectany) map<string, CREATE_FUNC> DynObjectFactory::mapCls_;
 
/*此类是一个间接的存在,*/
class Register
{
public:
    Register(const string& name, CREATE_FUNC func)
    {
        DynObjectFactory::Register(name, func);
    }
};
 
//如何在注册的时候就加入到工厂中的产品中
//通过定义一个static变量
//就可以对其进行初始化
//而这个static变量又要如何进行改变呢,那就要求用一个类来封装之前的函数
#define REGISTER_CLASS(class_name) \
class class_name##Register { \
public: \
    static void* NewInstance() \
    { \
        return new class_name; \
    } \
private: \
    static Register reg_; \
}; \
Register class_name##Register::reg_(#class_name, class_name##Register::NewInstance)
//必须紧紧的连在class_name后面
 
 
#endif // _DYN_BASE_H_

main.cpp

#include "Shape.h"
#include "DynBase.h"
#include <iostream>
#include <vector>
#include <string>
using namespace std;
 
 
 
void DrawAllShapes(const vector<Shape*>& v)
{
    vector<Shape*>::const_iterator it;
    for (it=v.begin(); it!=v.end(); ++it)
    {
        (*it)->Draw();
    }
}
 
void DeleteAllShapes(const vector<Shape*>& v)
{
    vector<Shape*>::const_iterator it;
    for (it=v.begin(); it!=v.end(); ++it)
    {
        delete(*it);
    }
}
 
 
int main(void)
{
    vector<Shape*> v;
 
    Shape* ps;
    ps = static_cast<Shape*>(DynObjectFactory::CreateObject("Circle"));
    v.push_back(ps);
    ps = static_cast<Shape*>(DynObjectFactory::CreateObject("Square"));
    v.push_back(ps);
    ps = static_cast<Shape*>(DynObjectFactory::CreateObject("Rectangle"));
    v.push_back(ps);
 
    DrawAllShapes(v);
    DeleteAllShapes(v);
 
 
    return 0;
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值