求大神帮我看下,这个问题我困扰了半个月

头文件1 dynbase.h

#ifndef   _DYNBASE_H_
#define   _DYNBASE_H_

#include <map>
#include <string>
using namespace std;

typedef void* (*CREATE_FUNC)();


class DynCreateFactory {
public:
	/* ----- 从map容器中得到响应的形状 ----- */
	static void* CreateShape(const string& name);
	/* ----- 运行时动态创建各类形放入map容器 ----- */
	static void registes(const string& name, CREATE_FUNC func);
private:
	static map<string, CREATE_FUNC> cls_;
};

/* ----- 利用构造函数自动调用DynCreateFactory中的registes函数 ----- */
class RegistObj {
public:
	RegistObj(const string& name, CREATE_FUNC func);
};

/* ----- 利用宏定义在main前创建工厂 ----- */
#define CREATE_OBJ(class_name) \
class class_name##Registe { \
public: \
	static void* Instance() { \
		return new class_name; \
    } \
private: \
	static RegistObj reg_; \
}; \
RegistObj  class_name##Registe::reg_(#class_name, class_name##Registe::Instance)

#endif // _DYNBASE_H_




头文件2 shape.h

#ifndef   _SHAPE_H_
#define   _SHAPE_H_

#include "dynbase.h"
#include <iostream>
using namespace std;

class Shape {
public:
	virtual void Draw() = 0;
	virtual ~Shape() {}
};

class Circle : public Shape {
public:
	virtual void Draw();
	~Circle();
};

class Rectangle : public Shape {
public:
	virtual void Draw();
	~Rectangle();
};

class Square : public Shape {
public:
	virtual void Draw();
	~Square();
};

#endif // _SHAPE_H_ 






源文件1 dynbase.cpp

#include "dynbase.h"

map<string, CREATE_FUNC> DynCreateFactory::cls_;

void* DynCreateFactory::CreateShape(const string& name) {
	map<string, CREATE_FUNC>::iterator it;

	it = cls_.find(name);
	if (it == cls_.end())
		return 0;
	else
		return it->second();
}

void DynCreateFactory::registes(const string& name, CREATE_FUNC func) {
	cls_[name] = func;
}

RegistObj::RegistObj(const string& name, CREATE_FUNC func) {
	DynCreateFactory::registes(name, func);
}





源文件2 shape.cpp

#include "shape.h"

void Circle::Draw() {
	cout << "Circle::Draw()" << endl;
}
Circle::~Circle() {
	cout << "~Circle()" << endl;
}

void Rectangle::Draw() {
	cout << "Rectangle::Draw()" << endl;
}

Rectangle::~Rectangle() {
	cout << "~Rectangle()" <<endl;
}

void Square::Draw() {
	cout << "Square::Draw()" <<endl;
}

Square::~Square() {
	cout << "~Square()" << endl;
}

CREATE_OBJ(Circle);
//CREATE_OBJ(Rectangle);
//CREATE_OBJ(Square);





源文件3 main.cpp

#include "shape.h"

int main(void) {
	Shape* sp = (Shape*)DynCreateFactory::CreateShape("Circle");
	sp->Draw();
	delete sp;

	return 0;
}

#C++工程师#
全部评论

相关推荐

06-13 17:33
门头沟学院 Java
顺序不记了,大致顺序是这样的,有的相同知识点写分开了1.基本数据类型2.基本数据类型和包装类型的区别3.==和equals区别4.ArrayList与LinkedList区别5.hashmap底层原理,put操作时会发生什么6.说出几种树型数据结构7.B树和B+树区别8.jvm加载类机制9.线程池核心参数10.创建线程池的几种方式11.callable与runnable区别12.线程池怎么回收线程13.redis三剑客14.布隆过滤器原理,不要背八股,说说真正使用时遇到了问题没有(我说没有,不知道该怎么回答了)15.堆的内存结构16.自己在写项目时有没有遇见过oom,如何处理,不要背八股,根据真实经验,我说不会17.redis死锁怎么办,watchdog机制如何发现是否锁过期18.如何避免redis红锁19.一个表性别与年龄如何加索引20.自己的项目的QPS怎么测的,有没有真正遇到大数量表21.说一说泛型22.springboot自动装配原理23.springmvc与springboot区别24.aop使用过嘛?动态代理与静态代理区别25.spring循环依赖怎么解决26.你说用过es,es如何分片,怎么存的数据,1000万条数据怎么写入库中27.你说用limit,那么在数据量大之后,如何优化28.rabbitmq如何批次发送,批量读取,答了延迟队列和线程池,都不对29.计网知不知道smtp协议,不知道写了对不对,完全听懵了30.springcloud知道嘛?只是了解反问1.做什么的?短信服务,信息量能到千万级2.对我的建议,基础不错,但是不要只背八股,多去实际开发中理解。面试官人不错,虽然没露脸,但是中间会引导我回答问题,不会的也只是说对我要求没那么高。面完问我在济宁生活有没有困难,最快什么时候到,让人事给我聊薪资了。下午人事打电话,问我27届的会不会跑路,还在想办法如何使我不跑路,不想扣我薪资等。之后我再联系吧,还挺想去的😭,我真不跑路哥😢附一张河科大幽默大专图,科大就是大专罢了
查看30道真题和解析
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-11 17:10
什么素质,我请问呢,要掉小珍珠了。。。又憋屈又生气
苍蓝星上艾露:给它们能的,一群dinner牛马挥刀向更弱者罢了。我写的开源求职AI co-pilot工具,优化你的简历,找到你匹配的岗位,定制你的简历,并让你做好面试准备https://github.com/weicanie/prisma-ai
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务