是否有可能未实现目标及问题问题,怎么解决

豆丁微信公众号
君,已阅读到文档的结尾了呢~~
广告剩余8秒
文档加载中
基于c/s&b/s模式的学籍管理系统研究与开发,学籍管理系统,全国学籍管理系统,陕西省学籍管理系统,陕西学籍管理系统,湖南省学籍管理系统,河南省学籍管理系统,安徽省学籍管理系统,贵州省学籍管理系统,广东学籍管理系统
扫扫二维码,随身浏览文档
手机或平板扫扫即可继续访问
基于c/s&b/s模式的学籍管理系统研究与开发
举报该文档为侵权文档。
举报该文档含有违规或不良信息。
反馈该文档无法正常浏览。
举报该文档为重复文档。
推荐理由:
将文档分享至:
分享完整地址
文档地址:
粘贴到BBS或博客
flash地址:
支持嵌入FLASH地址的网站使用
html代码:
&embed src='http://www.docin.com/DocinViewer-4.swf' width='100%' height='600' type=application/x-shockwave-flash ALLOWFULLSCREEN='true' ALLOWSCRIPTACCESS='always'&&/embed&
450px*300px480px*400px650px*490px
支持嵌入HTML代码的网站使用
您的内容已经提交成功
您所提交的内容需要审核后才能发布,请您等待!
3秒自动关闭窗口中国有没有可能实现民主?怎么实现, 需要先解决那些问题_百度知道
中国有没有可能实现民主?怎么实现, 需要先解决那些问题
我有更好的答案
还有再看看台湾。从这点上来说中华现在的制度是符合中华情况的。一个国最重要的是能够让一个地区的人民稳定下来发展,免离战乱 这才是国存在的真正意义,除了一些西方发达国 但是他们的成功跟民主没关系民主不一定更好如果不信你们看看世界上那些实行民主制度的国家有几个更好
采纳率:70%
外战争失败,内部矛盾尖锐到解决不了的时候等等都是结束一d ang的一些先决条件,经济危机,国内经济放缓甚至倒退....现在经济高速发展掩盖了大部分的社会矛盾.
额。我觉得民主是永远不可能实现的。人类社会只可能不断发展并完善,向着民主前进。你比如说西方国家的民主吧。。。发展了这么久对不对。他们也都没实现真正的民主。中国海很年轻有的是机会。。。
中国的政治体制改革正在进行。民主化进程正在完善。与满清政府比,我们很民主,与发达国家比,我们还很专制。你我平凡的人不能改天换地,所以只能耐心等待。 希望楼主采纳
呵呵,首先要说明民主是什么,列宁说过只要有阶级存在就没有纯粹的民主,有的只是阶级的民主,比如古希腊,中国的民主化是必然的,但是道路是曲折的,我们每个人都要负起责任来,等待民主到来是幼稚的,就像和谐是斗争争取来的一样,民主也离不开专制,至少现在如此,当然我们说的民主是对绝大多数人民说的,当然也尊重少数派的意见,但前提是大家的初衷都是善良的。我们要解决的首要问题,有人说是,腐,败,我认为是同时也不是,这只是一个表象,我敢说铁了心的要当贪官的毕竟是一小撮,大部分干部本身是好的,或者比较好,如果给他们一个良好的大环境,他们会是很好的人民公仆,(我就不信那么多官员都是从里往外的黑),天冷了,有人穿皮草,有人却不得不穿棉衣,这理不必说明了吧? 关键在于健全社会主义公有制,政治上完善健全,四大,自由,允许人民群众发表意见看法,允许人民群众监督官员,不要层层上告,告是要告的,告一次不成,就允许贴一张,大,字,报嘛!其实互联网已经有这种作用了,我们加强一些而已,群众监督是民主基石,把无产阶级是主人,工农联盟为基础的宪法落实下去,经济上对外要切断经济殖民,对内追查那些非法倾吐贱卖国有资产的行为,坚决打击官僚资本,买办资本,该没收的坚决没收,该查处的坚决查处,当然手法可以温柔一点,交出非法所得,写保证书检讨书,那么如果没有其他恶劣行为的话可以不追究刑事责任了,我们是要给出路了,改造他们,包括大部分腐,败官员我们也要如此对待,罪大恶极者决不手软,普通的就算了,不然追究我们恐怕我们每个人都有责任,相信大家能理解我的意思,文化上坚决打击汉,奸,严惩不贷,总之原则就是,坚持人民当家作主,走社会主义道路,以马列毛为指导思想,方针就是团结大多数,打击一小撮,惩前毙后,治病救人,当然都是自己的观点,一定有不当处,多多指正
民主,法制,联邦,是一体的,少一个,另外两个都是假的
其他4条回答
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。当前位置:
>>>有一些问题你可能不会求解,但是你仍有可能对这些问题的解是否合..
有一些问题你可能不会求解,但是你仍有可能对这些问题的解是否合理进行分析和判断.例如从解的物理量单位,解随某些已知量变化的趋势,解在一种特殊条件下的结果等方面进行分析,并与预期结果,实验结论等进行比较,从而判断解的合理性或正确性.举例如下:如图所示.质量为M,倾角为θ的滑块A放于水平地面上,把质量为m的滑块B放在A的斜面上.忽略一切摩擦,有人求得B相对地面的加速度a=M+mM+msin2θgsinθ,式中g为重力加速度.对于上述解,某同学首先分析了等号右侧量的单位,没发现问题.他进一步利用特殊条件对该解做了如下四项分析和判断,所得结论都是“解可能是对的”.但是,其中有一项是错误的.请你指出该项.(  )A.当θ°=0时,该解给出a=0,这符合常识,说明该解可能是对的B.当θ=90°时,该解给出a=g,这符合实验结论,说明该解可能是对的C.当M>>m时,该解给出a=gsinθ,这符合预期的结果,说明该解可能是对的D.当m>>M时,该解给出a=gsinθ,这符合预期的结果,说明该解可能是对的
题型:单选题难度:中档来源:北京
A、当θ=0°时,sinθ=0,故a=0,故A正确;B、当θ=90°时,sin90°=1,故a=g,自由落体,故B正确;C、当M>>m时,M+m≈M,M+msin2θ≈M,斜面体近似不动,可解出a=gsinθ,故C正确;D、当m>>M时,斜面体飞出,物体近似自由落体,a≈g;但由于M+m≈m,M+msin2θ≈msin2θ,根据表达式a=gsinθ,矛盾,故D错误;故选CD.
马上分享给同学
据魔方格专家权威分析,试题“有一些问题你可能不会求解,但是你仍有可能对这些问题的解是否合..”主要考查你对&&牛顿第二定律&&等考点的理解。关于这些考点的“档案”如下:
现在没空?点击收藏,以后再看。
因为篇幅有限,只列出部分考点,详细请访问。
牛顿第二定律
内容:物体的加速度跟所受的外力的合力成正比,跟物体的质量成反比,加速度的方向跟合外力的方向相同,表达式F=kma。在国际单位制中,k=1,上式简化为F合=ma。牛顿这个单位就是根据牛顿第二定律定义的:使质量是1kg的物体产生1m/s2加速度的力,叫做1N(kg·m/s2=N)。对牛顿第二定律的理解:①模型性牛顿第二定律的研究对象只能是质点模型或可看成质点模型的物体。②因果性力是产生加速度的原因,质量是物体惯性大小的量度,物体的加速度是力这一外因和质量这一内因共同作用的结果。③矢量性合外力的方向决定了加速度的方向,合外力方向变,加速度方向变,加速度方向与合外力方向一致。其实牛顿第二定律的表达形式就是矢量式。④瞬时性加速度与合外力是瞬时对应关系,它们同生、同灭、同变化。⑤同一性(同体性)中各物理量均指同一个研究对象。因此应用牛顿第二定律解题时,首先要处理好的问题是研究对象的选择与确定。⑥相对性在中,a是相对于惯性系的而不是相对于非惯性系的,即a是相对于没有加速度参照系的。⑦独立性F合产生的加速度a是物体的总加速度,根据矢量的合成与分解,则有物体在x方向的加速度ax;物体在y方向的合外力产生y方向的加速度ay。牛顿第二定律分量式为:。⑧局限性(适用范围)牛顿第二定律只能解决物体的低速运动问题,不能解决物体的高速运动问题,只适用于宏观物体,不适用与微观粒子。牛顿第二定律的应用: 1.应用牛顿第二定律解题的步骤: (1)明确研究对象。可以以某一个质点作为研究对象,也可以以几个质点组成的质点组作为研究对象。设每个质点的质量为mi,对应的加速度为ai,则有:F合=对这个结论可以这样理解:先分别以质点组中的每个质点为研究对象用牛顿第二定律:,将以上各式等号左、右分别相加,其中左边所有力中,凡属于系统内力的,总是成对出现并且大小相等方向相反,其矢量和必为零,所以最后得到的是该质点组所受的所有外力之和,即合外力F。。 (2)对研究对象进行受力分析,同时还应该分析研究对象的运动情况(包括速度、加速度),并把速度、加速度的方向在受力图旁边表示出来。 (3)若研究对象在不共线的两个力作用下做加速运动,一般用平行四边形定则(或三角形定则)解题;若研究对象在不共线的三个或三个以上的力作用下做加速运动,一般用正交分解法解题(注意灵活选取坐标轴的方向,既可以分解力,也可以分解加速度)。 (4)当研究对象在研究过程的小同阶段受力情况有变化时,那就必须分阶段进行受力分析,分阶段列方程求解。2.两种分析动力学问题的方法: (1)合成法分析动力学问题若物体只受两个力作用而产生加速度时,根据牛顿第二定律可知,利用平行四边形定则求出的两个力的合力方向就是加速度方向。特别是两个力互相垂直或相等时,应用力的合成法比较简单。 (2)正交分解法分析动力学问题当物体受到两个以上的力作用而产生加速度时,常用正交分解法解题。通常是分解力,但在有些情况下分解加速度更简单。 ①分解力:一般将物体受到的各个力沿加速度方向和垂直于加速度方向分解,则:(沿加速度方向),(垂直于加速度方向)。 ②分解加速度:当物体受到的力相互垂直时,沿这两个相互垂直的方向分解加速度,再应用牛顿第二定律列方程求解,有时更简单。具体问题中要分解力还是分解加速度需要具体分析,要以尽量减少被分解的量,尽量不分解待求的量为原则。3.应用牛顿第二定律解决的两类问题: (1)已知物体的受力情况,求解物体的运动情况解这类题目,一般是应用牛顿运动定律求出物体的加速度,再根据物体的初始条件,应用运动学公式,求出物体运动的情况,即求出物体在任意时刻的位置、速度及运动轨迹。流程图如下: (2)已知物体的运动情况,求解物体的受力情况解这类题目,一般是应用运动学公式求出物体的加速度,再应用牛顿第二定律求出物体所受的合外力,进而求出物体所受的其他外力。流程图如下:可以看出,在这两类基本问题中,应用到牛顿第二定律和运动学公式,而它们中间联系的纽带是加速度,所以求解这两类问题必须先求解物体的加速度。知识扩展:1.惯性系与非惯性系:牛顿运动定律成立的参考系,称为惯性参考系,简称惯性系。牛顿运动定律不成立的参考系,称为非惯性系。 2.关于a、△v、v与F的关系 (1)a与F有必然的瞬时的关系F为0,则a为0; F不为0,则a不为0,且大小为a=F/m。F改变,则a 立即改变,a和F之间是瞬时的对应关系,同时存在,同时消失.同时改变。 (2)△v(速度的改变量)与F有必然的但不是瞬时的联系 F为0,则△v为0;F不,0,并不能说明△v就一定不为0,因为,F不为0,而t=0,则△v=0,物体受合外力作用要有一段时间的积累,才能使速度改变。 (3)v(瞬时速度)与F无必然的联系 F为0时,物体可做匀速直线运动,v不为0;F不为0时,v可以为0,例如竖直上抛到达最高点时。
发现相似题
与“有一些问题你可能不会求解,但是你仍有可能对这些问题的解是否合..”考查相似的试题有:
437008297986294424300250368953416865遇到突发问题,如何快速有效解决?
作者 |Lachel 出品 | 芝士姐
来源 | 插坐学院(ID:chazuomba)
国内最好的新媒体学习平台,聚焦1000万新媒体人,提供专业课程、企业内训与解决方案等服务
职场上,我们常常会遇到许多问题,需要进行分析和判断,作出决策。
这其中,有些是可以团队协力,通过搜集数据、咨询专家、开会讨论决定的。
但更多的时候,你会遭遇到这样的情况:时间紧,优先级高,又恰好没有能求助的人。
那么,你该怎么做?
客户突然向你提出:希望将某个版本提前上线。怎么回应他?
老板突然抛给你一个项目,让你马上接手,准备落地,怎么办?
某个进行中的项目突然出现预期之外的意外,需要立刻处理,怎么做?
在这些情况下,「快速得到一个满意解」,是比「找出一个最优解」更重要的事情。你不必把事情做得特别完美,但你一定要给出一个方案,能够顺利把任务往前推进,以免延误项目的进度。
这也是检验一个人能力的最好机会。
那么,如果是你,遇到这样的情况,如何才能快速作出有效的分析,从而在顺利解决问题的同时,展现自己的能力?
下面这几个方法,也许可以帮到你。
5Why 分析法:定位问题核心
什么是 5 Why 分析法?这是丰田提出的方法论。实质上,就是通过对问题不断发问「为什么」,来找到问题背后的根源,对问题进行重新定义。
很多人会认为,快速解决问题,就是要尽可能快地行动。但其实,花一些时间去重新梳理、定义问题,反而会更加高效——因为通过这个过程,我们才能发现,哪些因素,是真正重要,真正亟待我们去解决的。
这样,我们就可以把有限的时间和精力,聚焦在最重要的环节上。
举个例子:
1. 客户有一笔应收款项,拖了很久才到账,导致现金流短缺。为什么?
—— 因为我们有一批产品延迟交货了,客户很不满意。
2. 为什么会延迟交货?
—— 因为这批产品的生产,花费的时间超出了预期。
3. 为什么花费时间会超出预期?
—— 因为某种材料用完了,中途花了一段时间去补货。
4. 为什么这种材料会用完?
—— 因为之前突然有一笔加急订单进来,材料都用在那个订单上面了。
5. 为什么无法同时应付两笔订单?
—— 我们的材料库存不足,并且没有备用的供应商。
通过这样的不断发问,我们就可以发现,问题的根源,不是客户经理失职,不是生产线出了问题,也不是项目规划、调动不当,而是在供应商的储备上出了纰漏。
那么,我们不必劳师动众,对整条生产线、管理体系进行整改,只需多拓展几个备用的供应商,做好应急方案,就可以有效避免这种情况再次发生。
回到前面的例子。
客户突然提出要求,希望将某个软件的版本提前上线。这个时候,你应该怎么做?是拒绝他,还是要求整个部门一起加班,赶出来?
更好的方式,是通过对这个需求进行剖析和发问,找到他背后的真正需求。
你会发现,很多时候,客户也许并不是真的要求「提前上线新版本」,而只是希望能使用新版本其中的某个功能。
这个时候,可以进一步发问:这个功能是不是必须的?它要用在什么场景里面?有没有其他的解决方案可以替代?
如果有,那么问题就简单很多了。你可以临时插入一个解决方案,让团队先赶出来;可以先做一个 alpha 版本,给客户用着;也可以通过外包、兼职的形式,用其他的方案来满足客户的需求。
比起拒绝客户,或者让团队加班赶工,这些做法,无疑是更能让双方满意的方案。
倒推法:灵活规划进度
这个时代,多线并行,已经是一种非常正常的现象。
大多数人的任务都是跟着项目走,手头上往往同时有着好几个项目,很少有人能专注在一件事情上面。这就会导致,当多个项目集中在一段时间里,就会产生超过符合的工作量。
那么,当好几个任务同时砸过来,时间紧,压力大,又没办法跟别人协调,该怎么办?
这个时候,可以使用「倒推法」,来减轻自己的负担。
什么是倒推法?就是对手头上的任务,分别这样发问:
这些任务里面,哪些是最重要的,必须优先完成?
需要优先完成的任务中,需要完成到什么进度,才能让人满意?
不需要优先完成的任务中,需保证有什么样的进度,才是可以接受的?
也就是,在截止时间之内,先预设好自己能够做到的成果——尽量满足「重要任务合格,次要任务过底线」的原则——再由这些成果出发,往回倒推:
要满足这样的结果,我需要如何安排时间,如何调配资源,如何安排执行的步骤?
这个思路,对于刚接手一个紧急项目的人,会相当有用。
在你没有时间全面了解整个项目时,不要考虑细节,而是从大局出发:
哪些成果是一定要出来的,越快越好?
哪些任务可以缓一缓?
哪些事情需要保证最基本的进度?
哪些环节需要加派人手,保证尽可能高的效率?
哪些因素只需要有人跟着,不出意外就好?
诸如此类。
在对结果进行规划之后,再往回倒推,有的放矢地调配人手、资源,就可以有效保证项目的平稳推进。
横向联系法:寻找替代方案
人总是有思维定势的。
资历越老,工作经验越丰富的人,其实更容易陷入思维定势之中。
长期用同一种方法去解决问题,久了,这种方法自然就会内化,成为本能。遇到问题时,我们也会习惯于先从这个方向去思考。
但有些时候,跳出思维定势的束缚,用「横向联系」的方式去思考,也许能找出更简便有效的办法。
什么是「横向联系」?如果一个问题的常规解决方法,很麻烦,不要急着动手去做,而是考虑:
我们要达到什么样的结果?
为了达到这个结果,我们需要解决什么问题?
有没有别的方式,可以把这个问题,转换成另一个较容易解决的问题?
举一个有意思的例子。
20 世纪 70 年代至 80 年代,有个乐队叫范海伦乐队。在他们的演出合同中,都有一条匪夷所思的条款:必须向乐队提供 M&M 巧克力豆,但其中不得含有棕色巧克力豆。
据说,乐队主唱罗斯一到现场,第一件事就是去后台拆开巧克力豆盒子,一旦在其中发现棕色巧克力豆,等待着主办方的就是罗斯的大发脾气,甚至取消演出。
有段时间,这成了乐队耍大牌的典型例子。
但事情的真相是什么呢?
罗斯后来在采访中提及这个条款,他解释到:
范海伦乐队的每场演出,对舞台的制作都有极高要求,细致到每一条线路、每一个设备、电流的大小、材质的承重能力……等等。每份规范手册都是一本厚厚的小书,为了确保主办方确实看了这份手册,他们加入了这条条款。
一旦在后台发现棕色巧克力豆,他就能百分之百肯定主办方没有仔细看这份手册,可能造成的后果,轻是舞台效果失误,重则是人员伤亡。
在这个案例中,我们要达到的效果是「场地参数是否严格按条款执行」,显然这是很难监测的。
所以,主唱通过设置一个小小的技巧,把问题转化成「主办方是否仔细看了条款」,解决起来就简单得多了。
同样,很多企业在秋招和春招的时候,尽管空缺的职位并不多,但仍然会乐于到各个学校驻点,做各种校招、招聘会、宣讲会,原因也是一样的:利用这些活动,为企业本身做品牌宣传。尤其是将学生作为目标受众或潜在目标受众的企业。
希望这几种简单的技巧,可以帮助你,在职场的道路上,更迅速、有效地解决问题,获得更加快速的成长。
注:文章配图来源网络,版权归原作者所有
作者:Lachel
责任编辑:
声明:本文由入驻搜狐号的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场。
今日搜狐热点[C++]实现--讨论关于实现中可能出现的问题
大多数情况下,适当地提出你的class和class template定义以及function和function template声明是花费最多心力的两件事情。一旦正确地完成他们,相当的实现就简单的多了,但实际上还存在少量问题值得注意。
1. 尽可能延后变量定义式的出现时间
不要太早地声明变量,因为你可能永远也用不到这个变量。
函数异常终止
void test(std::string& password) {
if (password.length() & MinimumPasswordLength) {
throw logic_error(&password is too short&);
encrypted变量在函数抛出异常时,还没有被使用就已经失效了。虽然一个变量对象所占的内存并不会太多,但这是一种注重效率的思维方式,仍然值得提及。
合理的做法应该等到需要使用encrypted时才声明它。
void test(std::string& password) {
if (password.length() & MinimumPasswordLength) {
throw logic_error(&password is too short&);
初始化的方法
初始化一个对象很多种方法,但不同的方法效率是不一样的。我们总是愿意使用效率更高的方法,例如初始化一个对象,不要先使用缺省构造函数,然后再赋值,而是直接使用复制构造函数直接初始化对象,可以节省很多地开销。
在循环中使用对象,此时应该如何声明对象?存在两种方法,一种是在循环内声明对象,另一种是在循环外声明对象。这两种方法的效率问题有值得讨论的地方。
两种方法的成本为:
1) n个构造函数和n个析构函数 2)1个构造函数+1个析构函数+n个赋值操作
如果class的一个赋值成本低于一组构造+析构成本,那么使用方法2总是更有效的,否则方法1更好。但是方法2变量的作用域更大,有时对程序的可理解性和易维护性造成冲击。因而除非1)你知道赋值成本比构造+析构成本低,2)你正在处理代码中效率高度敏感的部分,否则应该使用做法1。
2. 尽量少做转型动作
C++规则的设计目标之一是,保证&类型错误&绝不可能发生。理论上如果你的程序&很干净地&通过编译,就表示它并不会企图在任何对象上执行任何不安全、无意义、愚蠢荒谬的操作。这还是一个极具价值的保证!
然而,不幸的是,转型破坏了类型,那可能会导致一些麻烦,有些容易辨识,有些非常隐晦。本节讨论如何减少使用转型操作来使代码更有合理、高效。
C++转型机制
关于四种转型方式的区别详情见前文
基类指针指向子类
许多程序员相信,转型其实什么都没做,只是告诉编译器把某种类型视为另一种类型。但这是错误的观念。任何一种类型转换的(不论是显示的还是隐式的)往往真的令编译器编译出运行期间执行的码。就算是把int转型为double,因为在内存中int的存储方式和double的存储方式是截然不同的。
又例如我们可能会让一个基类指针指向一个子类:
class base { ... };
class derived : public base { ... };
base* pb = &d;
在这里我们不过是建立了一个base class指针指向一个derived class对象,但有时候上述两个指针值并不相同。这种情况下会有个偏移量(offset)在运行期被执行于dereived*指针上,用以取得正确的base*指针值。所以单一对象可能拥有一个以上的地址,这就意味着你总是需要避免做出基于&对象在C++中如何布局&的假设来执行相应的转型操作,因为不同编译器对于不同对象布局方式和他们的地址计算方式是不同的。
在子类中调用基类函数
另一个似是而非的代码出现在我们希望在子类函数中调用基类函数,如:
class Window {
virtual void onResize() { ... }
class SpeacialWindow {
virtual void onResize() {
static_cast(*this).onResize();
企图调用基类相关函数。
代码中强调了了转型动作,把this指针暂时转型为基类指针。当然没问题,的确调用了基类的函数,但问题仍然存在。实际上调用的并不是当前对象上的函数,而是稍早转型动作所建立的一个&*this对象之base class成分&的暂时副本身上的onResize!如果这个函数不对数据成员起影响当然就没有问题,但如果会改变数据成员就会出现很大的问题。
解决方法是去掉转型操作:
class SpeacialWindow {
virtual void onResize() {
Window::onResize();
// 通过作用符来强制调用基类的函数。
避免使用dynamic_cast
class Window { ... };
class SpecialWindow : public Window {
void blink();
typedef std::vector<std::shared_prt & VPW;
for (VPW::iterator iter = winPtrs.begin();
iter != winPtrys.end(); iter++) {
if (SpecialWindow* psw = dynamic_cast(iter-&get()))
psw-&blink();
}</std::shared_prt
之所以需要dynamic_cast,通常是因为你想在一个你认定为derived class对象身上执行dereived class操作函数,但你只有一个纸箱base的pointer/reference。但实际上,还是存在方法避免这个问题的。
在介绍解决方法之前,我们还需要强调,使用dynamic_cast是非常慢的!特别是在多种继承和深度继承时。因为他需要不断地寻找合适的class。
解放方法1:不使用base指针/reference
class Window { ... };
class SpecialWindow : public Window {
void blink();
typedef std::vector<std::shared_prt & VPSW;
for (VPW::iterator iter = winPtrs.begin();
iter != winPtrys.end(); iter++) {
(*iter)-&blink();
}</std::shared_prt
这里直接在容器内存放子类的指针。
解决方法2:virtual函数实现多态
但其实上,你不可能期望能在同一个容日内存储指针&指向所有可能之各种Window派生类&。所以更加合理的做法实际上是运用多态,实现动态绑定。
class Window {
virtual void blink() {
class SpecialWindow : public Window {
virtual void blink();
typedef std::vector<std::shared_prt & VPW;
for (VPW::iterator iter = winPtrs.begin();
iter != winPtrys.end(); iter++) {
(*iter)-&blink();
}</std::shared_prt
绝对要避免的就是使用一连串的dynamic_cast!因为这样会造成代码运行得很慢。如果要实现从基类指针到子类指针的转变还是应该使用virtual函数,实现多态。
另外值得注意的是,如果转型是必要的,试着把它隐藏在某个函数背后。客户随后可以调用该函数,而不需要将转型放进他们的代码内。
3. 避免返回handles指向对象内部成分
reference、pointer、iterator统统都是所谓的handles,而返回一个&代表对象内部数据&的handle,随之而来的就是&降低对象封装性&的风险。
假设我需要做一个表示矩型的类:
class Point {
Point(int x, int y);
void setY(int newY);
void setX(int newX);
struct RectData {
P // upper left-
P // lower right-
class Rectangle {
// 返回reference比返回value效率更高,避免了复制构造,但也出现了问题。
Point& upperLeft() const { return pData-& }
Point& lowerRight() const { return pData-& }
std:shared_ptr pD
这样的编译虽然没有问题,但是实际上却是错误,因为他们隐含危机。虽然upperLeft和lowerRight被声明为const成员函数,因为他们的目的只是为了提供客户一个得知Rectangle相关坐标点的方法,但不让客户修改rectangle,但另一方面却又返回reference指向private内部数据,调用者甚至可以通过这些reference更改内部数据!
这立刻带给我们两个教训。第一,成员变量的封装性最多只等于&返回其reference&的函数的访问级别(就像本例中的private成员变量实际上变成了public,因为通过reference函数修改)。第二,如果const成员函数返回一个reference,后者所指数据与对象自身有关联,而他们又被存储于对象之外,那么这个函数的调用者可以修改那笔数据。
解决方法其实很简单,一种方法是不传递reference,但这就意味着降低效率,另一种方法是把reference变成const。
class Rectangle {
const Point& upperLeft() const { return pData-& }
const Point& lowerRight() const { return pData-& }
std:shared_ptr pD
即使有了上述的叙述,问题仍然有可能存在。更准确的说,就是它可能导致dangling handles(空悬的handle),这种handles所指的东西(的所属对象)不复存在。这种&不复存在的对象&最常见的来源就是函数返回值。例如:
class GUIObject { ... };
const Rectangle boundingBox(const GUIObject& obj);
// in main..
GUIObject* // 随后会让pgo指向某个GUIObject
const Point* pUpperLeft = &(boundingBox(*pgo).upperLeft());
// error occurs!
对boundingBox的调用将获得一个新的、暂时的、rectangle对象。对个对象是个临时对象temp。随后upperLeft作用于temp身上,返回一个reference指向temp的一个内部成分,就是Point。但问题开始出现了。因为在upperLeft语句结束之后,boundingBox的返回值,也就是temp,将被销毁,而那间接导致temp内的Point析构,最后导致pUpperLeft指向一个不再存在的对象。所以pUpperLeft就变成空悬的了。
问题的关键在于,有个handles被传出去了,一旦如此你就是暴露在&handle比其所指对象更长寿&的风险!
问题的解决方法就是不返回handle,就算这会导致一些效率地降低,但他总是能及时的被复制在另一个临时变量中,然后被成功传值,而不会出现上述导致空悬handle的问题。
当然这也并不意味着你不能让成员函数返回handle,在某些容器中就允许返回reference。例如operator[]允许返回容器内部数据。尽管如此,这也只是例外,不是常态。
所以,请记住:
避免返回handle指向对象内部。这样你就可以增加封装性,帮助const成员函数的行为像个const,并将发生&dangling handle&的可能性降到最低。
4. 透彻了解inline
调用inline函数可以无需蒙受函数调用所招致的额外开销,如此有用的功能却也有许多东西值得注意。
inline实现原理
编译器最优化机制通常被设计用来浓缩那些&不含函数调用&的代码,所以当你inline某个函数,或许编译器就因此有能力对它执行语境相关最优化。而大部分编译器都不会对&outlined函数调用&动作执行如此之最优化。
然而,inline背后的整体观念是,将&对此函数的每一个调用&都以函数本体替换之。这样做可能增加你的目标码大小,并导致效率损失。但如果函数本体很小,编译器针对&函数本体&所产出的码可能比针对&函数调用&所产出的码更小,那么效率反而会增加。
记住,inline只是对编译器的一个申请,不是强制命令。这项申请可以隐喻提出,也可以明确提出。隐喻提出是将函数定义在class定义式内(friend函数也可被定义于class内,那么他们也是隐喻声明为inline)。明确提出,是在函数前面加关键字inline。
inline函数通常一定被置于头文件内,因为大多数建置环境(build environments)在编译过程中进行inlining,而为了将一个函数调用替换为被调用函数的本体,编译器必须知道那个函数长什么样。
template通常也被置于头文件内,因为它一旦被使用,编译器为了将它具体化,需要知道它长什么样。
但是template得具体化和inlining无关。如果你认为你所写的template,所有根据此template具体出来的函数都应该inline,就将此函数声明为inline,否则,不要这样这么做。
谁应该是inline
大部分编译器拒绝太过复杂(带有循环或递归)的函数inlining,而所有对virtual函数的调用inline都会落空。因为virtual意味着&等待&,在程序运行时才会决定哪个virtual函数被调用,而inline却意味着在编译期间就先将调用动作替换为被调用函数的本体。
有时候虽然编译器愿意inlining某个函数,但还是有可能为该函数生成一个函数本体。例如程序要取某个inline函数的地址,编译器通常必须为此函数生成一个outlined函数本体。毕竟编译器哪有能力提出一个指针指向并不存在的函数呢?
inline void f() { ... }
void (*pf)() =
// 这个调用或许不被inlined,因为它通过函数指针完成。
在我们决定哪些函数被声明为inline而哪些函数不应该时,我们应该掌握一个合乎逻辑的策略。一开始先不要将任何函数声明为inline,或至少将inline施行范围局限在哪些&一定称为inline&或&十分平淡无奇&的函数身上。慎重使用inline便是对日后使用调试器带来帮助,不过这么一来也等于把自己推向手工最优化之路。
不要忘记80-20经验法则:平均而言,一个程序往往将80%的执行时间花费在20%的代码上。这是一个重要的法则,它提醒着我们,作为一个软件开发者,我们的目标是找出可以有效增进程序整体效率的20%代码,然后将它inline或竭尽所能地将它瘦身。}

我要回帖

更多关于 未实现目标及问题 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信