我有一组类是用工厂生成的那么我如何把构造函数参数传进去

excited_lamb 2010-09-28 04:31:32
我想我必须用工厂,因为我不想对象生成在栈中,我想让它生成在我预先分配好的内存中。
下面是我想到的两种方式,不知有没有更好的办法?
代码只说明思路。

1.把构造函数的初始化函数放在另一个地方.
把生成后的对象指针强制转换为特定的类型,再进行真正的初始化

2.把所有的对象都统一使用一个参数做为构造函数的参数。如:
  //Test   class   
class CBase
{
}

class CT1 : public CBase
{public:
class MY_PARAM(p2,p2,p3) {}
CT1(const CP1 ¶m) {}
}

//Factory
template<class T>
CBase *CreateObject<T>(const T:: MY_PARAM ¶m)
{
//1.分配内存
//2.
CBase *p = new T(param);
//3.与相关资源进行关连
return p;
}

//use
CBase *p = CreateObject<CT1>(CT1::MY_PARAM(p1,p2,p3));
...全文
145 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
excited_lamb 2010-09-29
  • 打赏
  • 举报
回复
饿,书上后面也说了,要对频繁变化的那些部分做出抽象,并且拒绝不成熟的抽象.
不成熟的抽象,会带来复杂度.复杂度会带来难以理解和维护.
说的很有道理,,,但是我似乎很难深刻体会啊...(因为没经历过)
taodm 2010-09-29
  • 打赏
  • 举报
回复
这么复杂,值得么。
“因为书上说OCP是面向对象设计的核心所在。遵循这个可以带来巨大好处”并不是说必须要100%遵守。
编程是一个取舍和折中的艺术。
excited_lamb 2010-09-29
  • 打赏
  • 举报
回复
饿,因为书上说OCP是面向对象设计的核心所在。遵循这个可以带来巨大好处...
你BLOG中的<Abstract Factory, Template Style>文章,他那种厂实现方式似乎做到了开闭呀...
taodm 2010-09-29
  • 打赏
  • 举报
回复
为啥一定要满足开闭呢。关于创建的时候,是被排除在开闭原则范围之外的。
excited_lamb 2010-09-29
  • 打赏
  • 举报
回复
你的意思是用placement new解决没有默认构造函数的数组对象创建?

饿,我承认这个问题是我网上COPY过来的,,因为它似乎表达了一个我一直想知道的问题:

例如Shape类层次问题

Shape --> virtual void draw() = 0;
Circle --> 带属性 r(半径)
Rectangle --> 带属性 h,w(高宽)

解决这样的用例(要做到OCP):
>draw Circle 2.0
>draw Rectangle 3.0 4.0

Shape* s = Create("Circle");
s->draw();
//问题是如何初始化派生类对象,讲厂对象的书上似乎没提及到这个问题...
//好像一创建就能用一样
那么加入持久化方法
Shape* s = Create("Circle");
s->ParseFromString("2.0");
s->draw();

Shape* s = Create("Rectangle");
s->ParseFromString("3.0 4.0");
s->draw();

这样似乎就做到了开闭
>draw Triangle x x
代码中只要添加Triangle类,重载ParseFromString和draw,最后向工厂注册自己(创建自己的函数)

taodm 2010-09-29
  • 打赏
  • 举报
回复
不知道你听说过placement new没有?
excited_lamb 2010-09-29
  • 打赏
  • 举报
回复
我已经明白了,我应该在类层次中加入持久化方法
cxyOOOO 2010-09-28
  • 打赏
  • 举报
回复
像是要让对象池来管理对象生存期。
dinjay 2010-09-28
  • 打赏
  • 举报
回复
对象是唯一的么?是的话就用单例模式呗。

多个对象,可以构造函数私有,然后自己写new函数来实例化每个类的对象。
taodm 2010-09-28
  • 打赏
  • 举报
回复
方法3,你不需要工厂模式

64,651

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧