composite模式

kejie1235 2013-07-07 11:20:21
最近看设计模式 ,看到composite模式的一段代码,有些不明白,请高手指点

#include <vector>
#include <iostream> // std::cout
#include <memory> // std::auto_ptr
#include <algorithm> // std::for_each
#include <functional> // std::mem_fun
using namespace std;

class Graphic //class component
{
public:
virtual void print() const = 0;
virtual ~Graphic() {}
};

class Ellipse : public Graphic // class Leaf
{
public:
void print() const {
cout << "Ellipse \n";
}
};

class CompositeGraphic : public Graphic // class composite conclude a vector of pointer of componet
{
public:
void print() const {
// for each element in graphicList_, call the print member function
for_each(graphicList_.begin(), graphicList_.end(), mem_fun(&Graphic::print));
}

void add(Graphic *aGraphic) {
graphicList_.push_back(aGraphic);
}

private:
vector<Graphic*> graphicList_;
};

int main()
{
// Initialize four ellipses
const auto_ptr<Ellipse> ellipse1(new Ellipse());
const auto_ptr<Ellipse> ellipse2(new Ellipse());
const auto_ptr<Ellipse> ellipse3(new Ellipse());
const auto_ptr<Ellipse> ellipse4(new Ellipse());

// Initialize three composite graphics
const auto_ptr<CompositeGraphic> graphic(new CompositeGraphic());
const auto_ptr<CompositeGraphic> graphic1(new CompositeGraphic());
const auto_ptr<CompositeGraphic> graphic2(new CompositeGraphic());

// Composes the graphics
graphic1->add(ellipse1.get() );
graphic1->add(ellipse2.get() );
graphic1->add(ellipse3.get() );

graphic2->add(ellipse4.get());

graphic->add(graphic1.get());
graphic->add(graphic2.get());

// Prints the complete graphic (four times the string "Ellipse")
graphic->print();
return 0;
}



输出四次Ellipse,为什么不是两次?
...全文
114 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2013-07-08
  • 打赏
  • 举报
回复
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步对应汇编一行! 单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后,就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。 VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 不要迷信书、考题、老师、回帖; 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实! 有人说一套做一套,你相信他说的还是相信他做的? 其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗? 不要写连自己也预测不了结果的代码!
漫步者、 2013-07-08
  • 打赏
  • 举报
回复


 graphic1->add(ellipse1.get() ); 
  graphic1->add(ellipse2.get() );  
 graphic1->add(ellipse3.get() );      

graphic2->add(ellipse4.get());   

  graphic->add(graphic1.get()); 
  graphic->add(graphic2.get()); 


你再仔细体会一下这段代码,graphic1和graphic2中分别有多少个对象,自己再想想
kejie1235 2013-07-08
  • 打赏
  • 举报
回复
嗯 对对。是我看错了graphic-》add() add函数里面我看成基类的对象指针去了。 谢谢
橡木疙瘩 2013-07-08
  • 打赏
  • 举报
回复
引用 3 楼 kejie1235 的回复:
graphic1 中有三个对象,graphic2中一个对象,graphic中两个对象。 而graphic->print(); 我觉得应该是输出graphic中的两个对象,所以是两次。
graphic->print()确实会输出graphic中的两个对象,但这两个对象依然是CompositeGraphic,分别 是graphic1,graphic2,输出graphic1时输出了里面的3个ellipse,输出graphic2时输出了里面的1个ellipse。
kejie1235 2013-07-08
  • 打赏
  • 举报
回复
graphic1 中有三个对象,graphic2中一个对象,graphic中两个对象。

而graphic->print(); 我觉得应该是输出graphic中的两个对象,所以是两次。

64,646

社区成员

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

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