温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C++访问者模式

发布时间:2020-07-04 22:13:48 来源:网络 阅读:547 作者:Chinayu2014 栏目:编程语言

Visitor.h文件内容如下:

访问者和元素之间互以对方为参数

#ifndef __VISITOR__   #define __VISITOR__      #include <iostream>   #include <string>   #include <vcl.h>   using namespace std;      class Element;         ///访问者接口类   class Visitor   {     public:       virtual void Visit(Element *e) = 0;   };      //具体访问者A   class VisitorOne : public Visitor   {     public:       //实现访问接口,参数为元素,在类外面实现函数体       virtual void Visit(Element *e);   };      //具体访问者B   class VisitorTwo : public Visitor   {     public:       //实现访问接口,参数为元素,在类外面实现函数体       virtual void Visit(Element *e);   };      //=========================================================   //Element类   class Element   {     public:       virtual void Accept(Visitor *v)       {           v->Visit(this);//调用访问者接口       }          char* GetName()       {           return (char*)m_name.c_str();       }        public:       //类中待访问的元素       string m_name;      };      //具有个性数据的元素   class ElementA: public Element   {     public:       ElementA(string s)       {           m_name = s;//传入父类成员m_name中       }   };      class ElementB : public Element   {     public:       ElementB(string s)       {           m_name = s;       }   };      //=========================================================   //访问者类one对元素处理方法(须声明到Element类的后面否则编译不能通过)   void VisitorOne::Visit(Element *e)   {       //获取元素中的数据       char * data = e->GetName();       char szTemp[] = "正在处理数据:";       strcat(szTemp,data);       char  szTip[] = "第一个访问者";       MessageBox(0,+szTemp,szTip,0);   }   //访问者类two对元素的处理方法   void VisitorTwo::Visit(Element *e)   {       //获取元素中的数据       char * data = e->GetName();       char  szTemp[] = "正在处理数据:";       strcat(szTemp,data);       char  szTip[] = "第二个访问者";       MessageBox(0,+szTemp,szTip,0);   }      #endif

调用方法如下:

ElementA ea("元素A");   ElementB eb("元素B");      VisitorOne va;   VisitorTwo vb;      // 双分派,“接受者”和“访问者”决定了一个操作   ea.Accept(&va);   ea.Accept(&vb);      eb.Accept(&va);   eb.Accept(&vb);


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI