首页 > RenderTree渲染树

RenderTree渲染树

RenderTree渲染树对类中的静态成员有很重要的关系,这个和多态是有很重要的关系,举个简单的例子,在游戏中,马里奥需要渲染,蘑菇也需要渲染,怪兽也需要渲染,其是串在一个树上的,但是不同的类型怎么将其挂在一起,在渲染的过程中,马里奥,蘑菇和怪兽都是拥有不同的渲染接口,但是这样渲染器会做的很复杂,并不是我们想要的,简单的方式就是创建一个抽象基类,让马里奥,蘑菇和怪兽都继承同一个抽象基类,但是我们面临的问题是,对于马里奥,蘑菇和怪兽来说,他们的类型都是不一样的,怎么才能够穿在一个链表上

如上所示,提供一个纯虚函数show,使得下面的函数可以继承,每个子类中的show都是不一样的

为了将这些东西连起来,需要有个静态的头,这个是没有问题的

要串成一个链表,我们要求所有的节点都是类型是一样的,所以需要在每个节点加上next,因此这个链表本质上是父类指针next连在一起的

  1 #include 
  2 using namespace std;
  3 
  4 #include 
  5 #include 
  6 //父类需要提供一个接口
  7 class RenderShape
  8 {
  9 public:
 10     virtual void show()=0;
 11     bool init(int x,int y)
 12     {
 13         _x=x;
 14         _y=y;
 15         return true;
 16     }
 17 
 18     static void RenderShapeList()
 19     {
 20         RenderShape *t=head;
 21         while(t)
 22         {
 23             t->show();//所有的地方可以直接实现覆写
 24             t=t->next;
 25         }
 26     }
 27 
 28 protected:
 29     int _x;
 30     int _y;
 31     static RenderShape *head;//这个是需要共享的
 32            RenderShape *next;
 33 };
 34 
 35 RenderShape *RenderShape::head=nullptr;
 36 
 37 class Rect:public RenderShape
 38 {
 39 public:
 40     Rect *create(int x,int y,int w,int l)
 41     {
 42         Rect *pRet=new Rect;
 43         if(pRet&&pRet->init(x,y,w,l))
 44         {
 45             pRet->autoRelease();
 46         }
 47         else
 48         {
 49             delete pRet;
 50             pRet=nullptr;
 51         }
 52     }
 53 
 54     bool init(int x, int y,int w,int l)
 55     {
 56         RenderShape::init(x,y);
 57         _w=w;
 58         _l=l;
 59         return true;
 60     }
 61 
 62     void autoRelease()
 63     {
 64         this->next=head;
 65         head=this;
 66     }
 67 
 68     virtual void show()
 69     {
 70         cout<<"draw rect from"<<"("<<_x<<","<<")"<<_y
 71            <<"width"<<_w<<"length"<<_l<<endl;
 72     }
 73 protected:
 74     int _w;
 75     int _l;
 76 };
 77 
 78 class Circle:public RenderShape
 79 {
 80 public:
 81     Circle *create(int x,int y,int r)
 82     {
 83         Circle *pRet=new Circle;
 84         if(pRet&&pRet->init(x,y,r))
 85         {
 86             pRet->autoRelease();
 87         }
 88         else
 89         {
 90             delete pRet;
 91             pRet=nullptr;
 92         }
 93     }
 94 
 95     bool init(int x, int y, int r)
 96     {
 97         RenderShape::init(x,y);
 98         _r=r;
 99         return true;
100     }
101 
102     void autoRelease()
103     {
104         this->next=head;
105         head=this;
106     }
107 
108     virtual void show()
109     {
110         cout<<"draw circle from"<<"("<<_x<<","<<")"<<_y
111            <<"radius"<<_r<<endl;
112     }
113 
114 protected:
115     int _r;
116 };
117 
118 class Ellipse:public RenderShape
119 {
120 protected:
121     int _l;
122     int _s;
123 };
124 
125 void threadTask()
126 {
127     while(1)
128     {
129         cout<<"++++++++++++++++++++++++++"<<endl;
130         RenderShape::RenderShapeList();
131         sleep(2);
132         cout<<"--------------------------"<<endl;
133     }
134 }
135 int main()
136 {
137     Rect *pr;
138     Circle *pc;
139 
140     thread t(threadTask);
141     while(1)
142     {
143         int choice;
144         cin>>choice;
145         switch(choice)
146         {
147             case 1:
148                 pr=Rect::create(1,2,3,4);
149                 break;
150             case 2:
151                 pc=Circle::create(4,5,6);
152                 break;
153         }
154     }
155     t.join();
156     return 0;
157 }

 

转载于:https://www.cnblogs.com/Cucucudeblog/p/10224059.html

更多相关:

  •         Apache POI是一个开源的利用Java读写Excel,WORD等微软OLE2组件文档的项目。        我的需求是对Excel的数据进行导入或将数据以Excel的形式导出。先上简单的测试代码:package com.xing.studyTest.poi;import java.io.FileInputSt...

  • 要取得[a,b)的随机整数,使用(rand() % (b-a))+ a; 要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a; 要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1; 通用公式:a + rand() % n;其中的a是起始值,n是整数的范围。 要取得a到b之间的...

  • 利用本征图像分解(Intrinsic Image Decomposition)算法,将图像分解为shading(illumination) image 和 reflectance(albedo) image,计算图像的reflectance image。 Reflectance Image 是指在变化的光照条件下能够维持不变的图像部分...

  • 题目:面试题39. 数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2 限制: 1 <= 数组长度 <= 50000 解题: cl...

  • 题目:二叉搜索树的后序遍历序列 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。 参考以下这颗二叉搜索树:      5     /    2   6   /  1   3示例 1: 输入: [1,6,3,2,5] 输出...