当前位置: 首页 > 编程日记 > 正文

RenderTree渲染树

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

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

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

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

  1 #include <iostream>
  2 using namespace std;
  3 
  4 #include <thread>
  5 #include <unistd.h>
  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

相关文章:

JAVA IO流复制文件夹及里面的所有文件

public static void main(String[] args) throws Exception {//复制到哪个路径&#xff08;path&#xff09;中String path "E:\\main";File file new File("F:\\main");copyAll(file, path);}public static void copy(File file, String path) throws E…

python RSA 加密与签名

PyCrypto装起来就简单多了&#xff0c;我是直接 sudo easy_install pycrypto 直接搞定的先生成rsa的公私钥&#xff1a;打开控制台&#xff0c;输入 openssl 再输入 genrsa -out private.pem 1024 来生成私钥接着输入 rsa -in private.pem -pubout -out public.pem 来生成公钥$…

深度解析VC中的消息(上)

消息是指什么&#xff1f;消息系统对于一个win32程序来说十分重要&#xff0c;它是一个程序运行的动力源泉。一个消息&#xff0c;是系统定义的一个32位的值&#xff0c;他唯一的定义了一个事件&#xff0c;向Windows发出一个通知&#xff0c;告诉应用程序某个事情发生了。例如…

漫谈C#之关键字(1)

每一种语言都有非常多的关键字&#xff0c;而且这些关键字也都大同小异&#xff0c;不过毕竟还是有些许的不一样。有些关键字大家碰到的多了&#xff0c;自然就熟悉了&#xff0c;但是有些关键字用得不大多&#xff0c;或者是新引入的&#xff0c;所以就不大熟悉了。我平常在用…

Python-CSS整理

CSS层叠样式表 1.格式 h1 {name:abc&#xff0c;color:red}&#xff1b; 选择器-属性-值 2.ID和类选择 #ID .类 3.CSS引用方式 link文件-外部样式表 script style-内部样式表 标签 style-内联样式 4.background背景 ~background ~-color 背景颜色 ~-repeat 是否重复 ~-pos…

利用 socket 获取 tcp 包并解析的问题。

服务器端代码如下&#xff1a;&#xff08;Java Servlet 实现&#xff09; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { OutputStream out response.getOutputStream(); try { …

Mysql排序后显示排序序号

网上找的一个比较齐全的解释案例&#xff0c;拿来记录一下 ① : 与 的区别 : 赋值的意思。在set update select 中表示赋值的意思&#xff0c;用的比较少一般都用&#xff0c;但是在用变量实现行号时&#xff08;比如本文标题获取排列序号&#xff09;&#xff0c;一定要用:…

解决Visual Studio For Mac Restore失败的问题

之前就了解到微软出了mac版的VS&#xff0c;没太多的关注&#xff0c;自己也就是使用 DotNet Core SDK VS Code 做一些小demo。 前两天发布了DotNet Core 2.0 &#xff0c;Visual Studio For Mac 7.1 之后&#xff0c;感觉可以装起来用用&#xff0c;把win下面的项目转到Core上…

应用Etherchannel扩展企业服务的高可用性

什么是Etherchannel&#xff1f;Etherchannel可以说是Cisco特有的技术&#xff0c;也就是我们在交换机以及路由器上所要配置Etherchannel就不得不使用CISCO设备。在实际工程中一般用于出口与上层设备的连接。实际上通过Etherchannel的中文名-端口绑定就很容易理解&#xff0c;它…

Leetcode 391.完美矩形

完美矩形 我们有 N 个与坐标轴对齐的矩形, 其中 N > 0, 判断它们是否能精确地覆盖一个矩形区域。 每个矩形用左下角的点和右上角的点的坐标来表示。例如&#xff0c; 一个单位正方形可以表示为 [1,1,2,2]。 ( 左下角的点的坐标为 (1, 1) 以及右上角的点的坐标为 (2, 2) )。…

Meteor计时器

Meteor有提供它自己的setTimeout和setInterval方法。这些方法被用于确保所有全局变量都具有正确的值。它们就像普通 JavaScript 中的setTimeout 和 setInterval 一样工作。Timeout - 超时 Meteor.setTimeout 的例子。Meteor.setTimeout(function(){console.log("Timeout c…

WEB程序代码优化入手的几方面

这里对web程序方面的优化作一个总结.1.编码规范化可读性优化编码规范我想一般程序员不会不了解&#xff0c;如果你这方面是空白你应该好好补补基础了&#xff0c;做到编码规范是一个好的程序员的最基础要求&#xff0c;一个团队也应该有自己的编码规范。所以程序的优化也应该包…

【Elastic Stack(一)】Elastic Stack简介

如果你没有听说过Elastic Stack&#xff0c;那你一定听说过ELK。实际上ELK是三款软件的简称&#xff0c;分别是Elasticsearch、Logstash、Kibana组成&#xff0c;在发展的过程中&#xff0c;又有新成员Beats的加入&#xff0c;所以就形成了Elastic Stack。 所以说&#xff0c;…

c#创建、保存excel正常执行要点补疑

网上搜索C#实现excel操作的示例太多了&#xff0c;但不知道有多少是经过验证确实可行才发布出来的&#xff0c;也是因为开发需要&#xff0c;我找了一些代码却发现大多都不能正确执行完毕&#xff0c;于是决定补充自己在实践中遇到的要点以供参考。如下示例&#xff1a;usingMi…

动态更新 AGS Cache

作者&#xff1a;Flyingis 提升ArcGIS Server访问速度最佳的方式是Cache&#xff0c;将所有图层切片保存在服务器&#xff0c;客户端请求时直接访问cache好的图片&#xff0c;这里分为两种情况&#xff0c;一是所有图层都做cache&#xff0c;二是部分图层做cache&#xff0…

SVN状态图标不显示的两种解决办法

文章目录第一种方法第二种方法首先情况如下&#xff1a;这样看不到状态是不是就很难受 本博主最近也是第一次使用SVN做版本控制 然后就出现了这样的情况后来经过查询才知道SVN刚下载安装后 设置什么的都是默认的 需要手动设置一下就OK啦 第一种方法 我们先在桌面或者资源管理…

SPOJ ATOMS - Atoms in the Lab

题目链接&#xff1a;http://www.spoj.com/problems/ATOMS/ 题目大意&#xff1a;有N个原子&#xff0c;他们每秒分裂成K个新原子&#xff0c;新原子也能继续分裂。问如果要控制他的数量为M以内&#xff0c;应在什么时候使其停止分裂。其实时间为0. 解题思路&#xff1a;可以发…

hive lock命令的使用

1.hive锁表命令 hive> lock table t1 exclusive;锁表后不能对表进行操作2.hive表解锁&#xff1a; hive> unlock table t1;3.查看被锁的表 1.hive> show locks; 转载于:https://www.cnblogs.com/liyanbin/p/10237482.html

技术类人员的职业发展的4大方向

几乎每个企业都需要技术员的支持&#xff0c;生产制造型企业需要现场生产控制和工艺流程方面的技术人才&#xff1b;it等高科技行业需要大量软件研发和设备维护的硬件工程师&#xff1b;房地产、建筑工程领域需要建筑设计师、土木工程师和施工技术人员。此外&#xff0c;不论是…

Injection of @Reference dependencies failed;

配置、注解、xml什么的所有东西都没有问题 可能是接口这边所应用的jar包版本太高了 尝试将对应的版本降低试一下就好了 我这边是dubbo的版本太高导致一直出现这种问题

机器学习与数据科学 基于R的统计学习方法(基础部分)

1.1 机器学习的分类 监督学习&#xff1a;线性回归或逻辑回归&#xff0c; 非监督学习&#xff1a;是K-均值聚类&#xff0c; 即在数据点集中找出“聚类”。 另一种常用技术叫做主成分分析&#xff08;PCA&#xff09; &#xff0c; 用于降维&#xff0c; 算法的评估方法也不尽…

sql语句收集

1:随机抽取前30条select top 30 * from test order by newid()order by newid()&#xff1a;随机产生id号&#xff0c;然后根据id号排序&#xff1b;top 30&#xff1a;前30道题目。2:在排名次时&#xff0c;经常遇到取前10名&#xff0c;但刚好第11名&#xff08;12、13...&am…

atitit.php中的dwr 设计模式

atitit.php中的dwr 设计模式 1. dwr的长处相对于ajax来说。。1 2. DWR工作原理 1 3. php的dwr实现 1 4. 參考 3 1. dwr的长处相对于ajax来说。。 dwr是构建在ajax上的。。更加的dsl化。。大大简化了编写ajax的工作量。 2. DWR工作原理 是通过动态把Java类生成为Javascript。…

UML2.0工具比較

來源 前言 「工欲善其事&#xff0c;必先利其器」&#xff0c;學習UML沒有好的工具幫忙&#xff0c;往往會讓開發人員半途而廢&#xff0c;尤有甚者&#xff0c;開發人員有時會因為使用了不容易使用的開發工具而 誤認為UML是一個非常困難學習的「技術」。殊不知UML只是一種「語…

Spark快速入门

文章目录1、Spark概述1.1、什么是Spark&#xff1f;1.2、为什么要学Spark&#xff1f;1.3、Spark的特点1.3.1、运行速度快1.3.2、易用性好1.3.3、通用性强1.3.4、兼容性强2、搭建Spark集群2.1、下载2.2、环境准备2.3、配置免密登录2.4、开始安装2.5、Spark HA 高可用部署2.5.1、…

[14] 薪酬迅速翻倍的13条跳槽原则

首先&#xff0c;真正的高级人才是不用找工作的&#xff0c;因为只有被工作找的份。 但是&#xff0c;难免有些高级人才厌倦了旧的工作环境&#xff0c;或者遇到天花板&#xff0c;没有了发展空间&#xff0c;或者遇到新老板上任后排除异己来提拔自己的亲信等等&#xff0c;如果…

html的body内标签之input系列1

1. Form的作用&#xff1a;提交当前的表单. 类似于去了银行提交的纸质单子&#xff0c;递到后台去办理相关业务。 text,password只有输入的功能&#xff1b;button,submit只有点击的功能。想要把这些信息提交&#xff0c;需要用Form button毛线用也没有&#xff08;以后学JS的…

华为交换机系列异常流量抑制

作者:邓聪聪 配置流量抑制示例 配置流量抑制后的广播、未知单播和组播报文的速率为接口速率的 % 进入接口视图 <Quidway> system-view [Quidway] interface gigabitethernet 2/0/12 配置广播流量抑制 [Quidway-GigabitEthernet2/0/12] broadcast-suppression 80 配置组播…

微软,您的.net为中国程序员带来了什么?

往事如烟&#xff1a;2003年&#xff0c;那时我还在念大三&#xff0c;像中国大多数学生一样&#xff0c;为到底是投诚Java还是效忠.net日夜争论&#xff0c;上下求索&#xff0c;迷茫中特别渴望有一盏明灯照亮我辈学子的前程&#xff0c;当时&#xff0c;各大媒体的报道是市场…

NHibernate初学体验记

NHibernate 是一个基于.Net 的针对关系型数据库的对象持久化类库。NHibernate 来源于优秀的基于Java的关系型持久化工具Hibernate。NHibernate持久化你的.Net 对象到关系型数据库&#xff0c;远胜于写SQL去从数据库存取对象。你的代码仅仅和对象关联&#xff0c;NHibernat 自动…