一种基类的设计

combobox2013 2013-07-04 11:34:29
基类的设计是否有问题?


基类提供了一个copy函数

函数原型大概为:

基类指针 Copy(cosnt 基类指针);

真不懂这种设计有什么好处? 感觉怪怪的, 首先你得知道你要派生有多少种类,

然后在Copy函数根据一些变量来区分是那种类, 然后用dynamic_cast来进行转换


感觉怪怪的
...全文
326 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
mujiok2003 2013-07-05
  • 打赏
  • 举报
回复
引用 19 楼 combobox2013 的回复:
[quote=引用 16 楼 ganpengjin1 的回复:] ls.这个Copy方法设置为静态是在是不妥当,为什么呢,因为首先静态是为了保存当前状态用的,而你的Copy中却重新复制了一份数据给外部对象,所以你的这个static在这里无任何作用,失去了它原有的意义。 其次,在你的Copy构造函数中,尽量少做转型动作,用多态方式都是可以搞定的。
可否提供的你的代码,如果不方便提供的话, 可否提供相关的例子或者文章
引用 18 楼 mujiok2003 的回复:
C++提供了运行时动态机制,可以结合prototype模式,很好的完成这个需求。
多谢你的思路,可否提供相关的例子, 我学习一下, 多谢 [/quote] 看看这个
combobox2013 2013-07-05
  • 打赏
  • 举报
回复
引用 16 楼 ganpengjin1 的回复:
ls.这个Copy方法设置为静态是在是不妥当,为什么呢,因为首先静态是为了保存当前状态用的,而你的Copy中却重新复制了一份数据给外部对象,所以你的这个static在这里无任何作用,失去了它原有的意义。 其次,在你的Copy构造函数中,尽量少做转型动作,用多态方式都是可以搞定的。
可否提供的你的代码,如果不方便提供的话, 可否提供相关的例子或者文章
引用 18 楼 mujiok2003 的回复:
C++提供了运行时动态机制,可以结合prototype模式,很好的完成这个需求。
多谢你的思路,可否提供相关的例子, 我学习一下, 多谢
mujiok2003 2013-07-05
  • 打赏
  • 举报
回复
C++提供了运行时动态机制,可以结合prototype模式,很好的完成这个需求。
mujiok2003 2013-07-05
  • 打赏
  • 举报
回复
引用 10 楼 combobox2013 的回复:
[quote=引用 9 楼 u010936098 的回复:] 既然是静态函数,那么大概就是clone的静态版本了。不过clone可以通过多态来对象类型,静态函数无法实现这一点,大概只能用dynamic_cast去多分支了。
引用 6 楼 ForestDB 的回复:
[quote=引用 5 楼 combobox2013 的回复:] [quote=引用 4 楼 ganpengjin1 的回复:] 显然是要通过多态的方式来进行深浅拷贝用的
错 这个函数式静态函数 [/quote] 那显然设计有问题了。[/quote] 看源码: class CBase; class CDerived1; //继承CBase class CDerived1; //CBase CBase* CBase::Copy(const CBase* pSrc) { switch (pSrc->m_nType) { case 1: { const CDerived1* pDerived1 = dynamic_cast<const CDerived1*>(pSrc); if (pDerived1 == NULL) { ASSERT(FALSE); return NULL; } return new CDerived1(*pDerived1); } break; case 2: { const CDerived2* pDerived2 = dynamic_cast<const CDerived2*>(pSrc); if (pDerived2 == NULL) { ASSERT(FALSE); return NULL; } return new CDerived2(*pSysSrc); } break; default: ASSERT(FALSE); return NULL; } return NULL; } [/quote] 违反OCP原则(开闭原则),不过在稍加改良也是没有问题的。 比如: m_nType和Clone的实现放在独立的动态库中。需要扩展的时候,提供不同的dll即可。
漫步者、 2013-07-05
  • 打赏
  • 举报
回复
ls.这个Copy方法设置为静态是在是不妥当,为什么呢,因为首先静态是为了保存当前状态用的,而你的Copy中却重新复制了一份数据给外部对象,所以你的这个static在这里无任何作用,失去了它原有的意义。 其次,在你的Copy构造函数中,尽量少做转型动作,用多态方式都是可以搞定的。
combobox2013 2013-07-05
  • 打赏
  • 举报
回复
引用 14 楼 ganpengjin1 的回复:
[quote=引用 10 楼 combobox2013 的回复:] [quote=引用 9 楼 u010936098 的回复:] 既然是静态函数,那么大概就是clone的静态版本了。不过clone可以通过多态来对象类型,静态函数无法实现这一点,大概只能用dynamic_cast去多分支了。
引用 6 楼 ForestDB 的回复:
[quote=引用 5 楼 combobox2013 的回复:] [quote=引用 4 楼 ganpengjin1 的回复:] 显然是要通过多态的方式来进行深浅拷贝用的
错 这个函数式静态函数 [/quote] 那显然设计有问题了。[/quote] 看源码: class CBase; class CDerived1; //继承CBase class CDerived1; //CBase CBase* CBase::Copy(const CBase* pSrc) { switch (pSrc->m_nType) { case 1: { const CDerived1* pDerived1 = dynamic_cast<const CDerived1*>(pSrc); if (pDerived1 == NULL) { ASSERT(FALSE); return NULL; } return new CDerived1(*pDerived1); } break; case 2: { const CDerived2* pDerived2 = dynamic_cast<const CDerived2*>(pSrc); if (pDerived2 == NULL) { ASSERT(FALSE); return NULL; } return new CDerived2(*pSysSrc); } break; default: ASSERT(FALSE); return NULL; } return NULL; } [/quote] 楼主,你的copy函数呢?哪呢,我没看见,我只看见了一个Copy为父类的构造函数,我在4L,已说明这个就是采用堕多态的方式来进行复制的。[/quote] 笔误 ,不好意思,我大小写写错了 只有一个函数就是Copy,不存在copy函数(后者是小写,只有前者) 基类里声明static CBase* Copy(const CBase* pSrc); 这是函数定义:CBase* CBase::Copy(const CBase* pSrc);
漫步者、 2013-07-04
  • 打赏
  • 举报
回复
显然是要通过多态的方式来进行深浅拷贝用的
橡木疙瘩 2013-07-04
  • 打赏
  • 举报
回复
virtual base* clone() const
bruceteen 2013-07-04
  • 打赏
  • 举报
回复
符合语法的代码,未必不是SB写的呆屄代码
combobox2013 2013-07-04
  • 打赏
  • 举报
回复
漫步者、 2013-07-04
  • 打赏
  • 举报
回复
引用 10 楼 combobox2013 的回复:
[quote=引用 9 楼 u010936098 的回复:] 既然是静态函数,那么大概就是clone的静态版本了。不过clone可以通过多态来对象类型,静态函数无法实现这一点,大概只能用dynamic_cast去多分支了。
引用 6 楼 ForestDB 的回复:
[quote=引用 5 楼 combobox2013 的回复:] [quote=引用 4 楼 ganpengjin1 的回复:] 显然是要通过多态的方式来进行深浅拷贝用的
错 这个函数式静态函数 [/quote] 那显然设计有问题了。[/quote] 看源码: class CBase; class CDerived1; //继承CBase class CDerived1; //CBase CBase* CBase::Copy(const CBase* pSrc) { switch (pSrc->m_nType) { case 1: { const CDerived1* pDerived1 = dynamic_cast<const CDerived1*>(pSrc); if (pDerived1 == NULL) { ASSERT(FALSE); return NULL; } return new CDerived1(*pDerived1); } break; case 2: { const CDerived2* pDerived2 = dynamic_cast<const CDerived2*>(pSrc); if (pDerived2 == NULL) { ASSERT(FALSE); return NULL; } return new CDerived2(*pSysSrc); } break; default: ASSERT(FALSE); return NULL; } return NULL; } [/quote] 楼主,你的copy函数呢?哪呢,我没看见,我只看见了一个Copy为父类的构造函数,我在4L,已说明这个就是采用堕多态的方式来进行复制的。
sdchenchen2012 2013-07-04
  • 打赏
  • 举报
回复
引用 11 楼 ZLhy_ 的回复:
这个在游戏引擎中的类框架里面会很常见的 class CC_DLL CCCopying { public: virtual CCObject* copyWithZone(CCZone* pZone); }; 这个类是cocos2d-x引擎的最顶层的类,只是负责复制而已,在其下面有一个类CCObject: class CC_DLL CCObject : public CCCopying { public: // object id, CCScriptSupport need public m_uID unsigned int m_uID; // Lua reference id int m_nLuaID; protected: // count of refrence unsigned int m_uReference; // is the object autoreleased bool m_bManaged; public: CCObject(void); virtual ~CCObject(void); void release(void); void retain(void); CCObject* autorelease(void); CCObject* copy(void); bool isSingleRefrence(void); unsigned int retainCount(void); virtual bool isEqual(const CCObject* pObject); virtual void update(float dt) {CC_UNUSED_PARAM(dt);}; friend class CCAutoreleasePool; }; 上面这个类是控制引用计数的,我熟悉过的两个引擎都是这么实现的。
压根 不一样 顶楼的是静态函数 你的是什么?
ybdesire 2013-07-04
  • 打赏
  • 举报
回复
能解释下使用场景和意义吗?
引用 11 楼 ZLhy_ 的回复:
这个在游戏引擎中的类框架里面会很常见的 class CC_DLL CCCopying { public: virtual CCObject* copyWithZone(CCZone* pZone); }; 这个类是cocos2d-x引擎的最顶层的类,只是负责复制而已,在其下面有一个类CCObject: class CC_DLL CCObject : public CCCopying { public: // object id, CCScriptSupport need public m_uID unsigned int m_uID; // Lua reference id int m_nLuaID; protected: // count of refrence unsigned int m_uReference; // is the object autoreleased bool m_bManaged; public: CCObject(void); virtual ~CCObject(void); void release(void); void retain(void); CCObject* autorelease(void); CCObject* copy(void); bool isSingleRefrence(void); unsigned int retainCount(void); virtual bool isEqual(const CCObject* pObject); virtual void update(float dt) {CC_UNUSED_PARAM(dt);}; friend class CCAutoreleasePool; }; 上面这个类是控制引用计数的,我熟悉过的两个引擎都是这么实现的。
疯狂的红豆 2013-07-04
  • 打赏
  • 举报
回复
这个在游戏引擎中的类框架里面会很常见的 class CC_DLL CCCopying { public: virtual CCObject* copyWithZone(CCZone* pZone); }; 这个类是cocos2d-x引擎的最顶层的类,只是负责复制而已,在其下面有一个类CCObject: class CC_DLL CCObject : public CCCopying { public: // object id, CCScriptSupport need public m_uID unsigned int m_uID; // Lua reference id int m_nLuaID; protected: // count of refrence unsigned int m_uReference; // is the object autoreleased bool m_bManaged; public: CCObject(void); virtual ~CCObject(void); void release(void); void retain(void); CCObject* autorelease(void); CCObject* copy(void); bool isSingleRefrence(void); unsigned int retainCount(void); virtual bool isEqual(const CCObject* pObject); virtual void update(float dt) {CC_UNUSED_PARAM(dt);}; friend class CCAutoreleasePool; }; 上面这个类是控制引用计数的,我熟悉过的两个引擎都是这么实现的。
combobox2013 2013-07-04
  • 打赏
  • 举报
回复
引用 9 楼 u010936098 的回复:
既然是静态函数,那么大概就是clone的静态版本了。不过clone可以通过多态来对象类型,静态函数无法实现这一点,大概只能用dynamic_cast去多分支了。
引用 6 楼 ForestDB 的回复:
[quote=引用 5 楼 combobox2013 的回复:] [quote=引用 4 楼 ganpengjin1 的回复:] 显然是要通过多态的方式来进行深浅拷贝用的
错 这个函数式静态函数 [/quote] 那显然设计有问题了。[/quote] 看源码: class CBase; class CDerived1; //继承CBase class CDerived1; //CBase CBase* CBase::Copy(const CBase* pSrc) { switch (pSrc->m_nType) { case 1: { const CDerived1* pDerived1 = dynamic_cast<const CDerived1*>(pSrc); if (pDerived1 == NULL) { ASSERT(FALSE); return NULL; } return new CDerived1(*pDerived1); } break; case 2: { const CDerived2* pDerived2 = dynamic_cast<const CDerived2*>(pSrc); if (pDerived2 == NULL) { ASSERT(FALSE); return NULL; } return new CDerived2(*pSysSrc); } break; default: ASSERT(FALSE); return NULL; } return NULL; }
橡木疙瘩 2013-07-04
  • 打赏
  • 举报
回复
既然是静态函数,那么大概就是clone的静态版本了。不过clone可以通过多态来对象类型,静态函数无法实现这一点,大概只能用dynamic_cast去多分支了。
漫步者、 2013-07-04
  • 打赏
  • 举报
回复
5L,设置为静态?这个真不是什么好办法,copy应该是那个设计者要作为拷贝用的,但是又设置为静态,这个逻辑上有点问题。
ztenv 版主 2013-07-04
  • 打赏
  • 举报
回复
引用 6 楼 ForestDB 的回复:
[quote=引用 5 楼 combobox2013 的回复:] [quote=引用 4 楼 ganpengjin1 的回复:] 显然是要通过多态的方式来进行深浅拷贝用的
错 这个函数式静态函数 [/quote] 那显然设计有问题了。[/quote] 一定是设计有问题,有可能是为了赶工而设计的后来没有改吧
ForestDB 2013-07-04
  • 打赏
  • 举报
回复
引用 5 楼 combobox2013 的回复:
[quote=引用 4 楼 ganpengjin1 的回复:] 显然是要通过多态的方式来进行深浅拷贝用的
错 这个函数式静态函数 [/quote] 那显然设计有问题了。
combobox2013 2013-07-04
  • 打赏
  • 举报
回复
引用 4 楼 ganpengjin1 的回复:
显然是要通过多态的方式来进行深浅拷贝用的
错 这个函数式静态函数

64,644

社区成员

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

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