当前位置:  编程技术>综合
本页文章导读:
    ▪More Effective C++读书笔记9      Item 9:使用析构函数防止资源泄漏 这一章我觉得可以算作是异常安全处理的一种情况,也就是说在异常发生的情况下,保证资源能被正确释放。 这里分为两种情况来讨论, 一是指针操作 举.........
    ▪五分钟学会HTML5!(二)      html5开发与旧式浏览器的兼容 我们已经讨论了HTML5许多很酷的新功能,包括新的语义元素、为画图而生的canvas标签,以及音频与视频支持。 你可能会想:这些东西是很好,但当用户的浏览器.........
    ▪五分钟学会HTML5!(一)      语义标签和页面布局 我们首先讲一个关于一所大学的经典故事。这所大学在建设校园草地时,没有开辟任何步行小道,他们把整个空地种上草,然后等待。 一年以后,人们经常走过的地方,.........

[1]More Effective C++读书笔记9
    来源: 互联网  发布时间: 2013-11-10
Item 9:使用析构函数防止资源泄漏

这一章我觉得可以算作是异常安全处理的一种情况,也就是说在异常发生的情况下,保证资源能被正确释放。
这里分为两种情况来讨论,
一是指针操作
举个例子:
void myFucntion()
{
    Object* obj = getBack();
    obj->doSomething();
    delete obj;
}


如果在obj->doSomething()中发生异常,那么delete obj将不会执行,这是个很显然的泄露问题。想到的第一解决方法基本都是加上try...catch(),Ok那么让我们重新整理代码。
void myFucntion()
{
    Object* obj = getBack();
    try
    {  
        obj->doSomething();
    }
    catch(...)
    {
        delete obj;
    }
    delete obj;
}


好吧,我承认,程序很丑陋,代码重复,那么继续改进。
void myFucntion()
{
    Object* obj = getBack();
    try
    {  
        obj->doSomething();
    }
    catch(...)
    {
        ...
    }
    finally
    {
        delete obj;
    }
}


Ok,问题已经解决。但是还不要高兴,满篇的try catch,如果有很多地方都需要加try catch,那么工作量也是非常惊人的,当然你也可以这样写,但是我觉得作为程序员就是要有“懒惰”的思想,要简化,越简单越好,代码越少出错的地方也就越少。那么你一定想到了,利用智能指针auto_ptr或者share_ptr来解决问题。Ok,尽管不推荐auto_ptr,但是老的代码中还是会出现的。
void myFucntion()
{
    share_ptr<Object*> obj(getBack());
    obj->doSomething();
}


Perfect!

二是对象操作
最常见的问题时windows中的各种handler的关闭泄露问题,我们可以针对handler进行一个封装,在析构函数中释放handler。
class WindowHandle
{
public:
    WindowHandle(WINDOW_HANDLE handle): w(handle) {}
    ~WindowHandle() { destroyWindow(w); }
    operator WINDOW_HANDLE() { return w; } // see below
private:
    WINDOW_HANDLE w;
    WindowHandle(const WindowHandle&);
    WindowHandle& operator=(const WindowHandle&);
}; 


作者:goof 发表于2013-1-8 11:54:32 原文链接
阅读:39 评论:0 查看评论

    
[2]五分钟学会HTML5!(二)
    来源: 互联网  发布时间: 2013-11-10

html5开发与旧式浏览器的兼容

我们已经讨论了HTML5许多很酷的新功能,包括新的语义元素、为画图而生的canvas标签,以及音频与视频支持。

你可能会想:这些东西是很好,但当用户的浏览器不兼容HTML5时,可能就没法使用它们了。更不用说一些所谓的“支持”HTML5的浏览器,实际上只支持它的一部分功能而已。并不是所有HTML5新功能都会被所有浏览器所支持,而且许多HTML5特性在不同浏览器上也许使用了不同的实现方式。

不过,有一种方法可以使用新的特性,同时不影响旧版浏览器对你的站点的访问。你可以使用polyfill。

根据Paul Irish的说法,polyfill是模拟未来API的shim,它向旧版浏览器提供后备的功能。当旧版浏览器不支持站点中的某项HTML5功能时,polyfill会补充其中的空隙。学会使用这些polyfill,你就不必为了使用HTML5而抛弃那些使用旧版浏览器的用户。

获得polyfill支持的一种方法是使用JavaScript库——Modernizr(当然可用的不止这一种)。它会带来特性侦测能力,这样你就能检查浏览器究竟是否支持某种功能(比如canvas元素)。如果不支持,就提供一个备用的选择。

让我们研究一个示例。还记得吗?在介绍语义元素与页面布局时,我们已经使用过这个例子了。

< !DOCTYPE html>
< html>
< head>
    <meta charset="utf-8" />
    <title>Title</title>
    <link href=/blog_article/"css/html5reset.css" rel="stylesheet" />
    <link href=/blog_article/"css/style.css" rel="stylesheet" />
< /head>
< body>
    <header>
        <hgroup>
            <h1>Header in h1</h1>
            <h2>Subheader in h2</h2>
        </hgroup>
    </header>
    <nav>
        <ul>
            <li><a href=/blog_article/"/index.html Option 1</a></li>
            <li><a href=/blog_article/"/index.html Option 2</a></li>
            <li><a href=/blog_article/"/index.html Option 3</a></li>
        </ul>
    </nav>
    <section>
        <article>
            <header>
                <h1>Article #1</h1>
            </header>
            <section>
                This is the first article.  This is <mark>highlighted</mark>.
            </section>
        </article>
        <article>
            <header>
                <h1>Article #2</h1>
            </header>
            <section>
                This is the second article.  These articles could be blog posts, etc. 
            </section>
        </article>
    </section>
    <aside>
        <section>
            <h1>Links</h1>
            <ul>
                <li><a href=/blog_article/"/index.html 1</a></li>
                <li><a href=/blog_article/"/index.html 2</a></li>
                <li><a href=/blog_article/"/index.html 3</a></li>
            </ul>
        </section>
        <figure>
            <img width="85" height="85"
                src=/blog_article/"http_/www_windowsdevbootcamp_com/Images/JennMar.jpg
                alt="Jennifer Marsman" />
            <figcaption>Jennifer Marsman</figcaption>
        </figure>
    </aside>
    <footer>Footer - Copyright 2011</footer>
< /body>
< /html>
复制代码

这段代码包含了一系列不被旧版浏览器支持的新HTML5元素。记住,在IE9中,它的效果如下图所示。



我们可以使用Internet Explorer开发工具观察它在旧版IE中的模样。在Internet Explorer界面下,按F12键打开Internet Explorer开发工具。



注意,现在的Browser Mode(在页面上方的灰色菜单栏里)被设置为IE9。单击Browser Mode,在弹出的下拉列表中选择“Internet Explorer 8”(IE8不支持HTML5)。



修改完成,转到不兼容HTML5的浏览器之后,Web页面变得如下图所示。



这个效果看起来非常差劲,但实际上问题没那么严重。页面布局变得乱糟糟的原因,是IE8没能识别我所使用的那些HTML5新元素,于是就没有把它们加到DOM,随之而来的就是我们不能使用CSS去设计页面。

尽管如此,增加一条对Modernizr的引用(不需要改动任何其他代码!),就会把这些元素强制放入DOM。从http://www.modernizr.com/download/下载完Modernizr后,在< head>区域添加一条引用即可,代码如下所示。

<head>
    <meta charset="utf-8" />
    <title>Title</title>
    <link href=/blog_article/"css/html5reset.css" rel="stylesheet" />
    <link href=/blog_article/"css/style.css" rel="stylesheet" />
    <script src=/blog_article/"script/jquery-1.6.2.min.js" type="text/javascript"></script>
    <script src=/blog_article/"script/modernizr-2.0.6.js" type="text/javascript"></script>
< /head>
复制代码

这里增加了两条脚本引用,一条指向jQuery,一条指向Modernizr。现在并不真的需要使用jQuery,但下一个脚本中它就要大显身手,所以这里一并增加了对它们的引用。

这么一个简单的变化,使得页面在IE8中变成了下图所示的式样。



它并不完美,但已经与我们在IE9中见到的原版本相当接近。Modernizr把这些IE8不能理解的HTML5新元素加入了DOM,正因为如此,我们才能用CSS去设计它们。

其实,Modernizr可以做的远不止此。仔细观察前述Web页面的IE8和IE9版本,你会发现后者的两个article和图片的四角上有非常好看的圆角效果,而IE8中却没有。使用Modernizr,同样可以修复这一效果。

<script type="text/javascript">
        if (!Modernizr.borderradius) {
            $.getScript("script/jquery.corner.js", function() {
                $("article").corner();
                $("figure").corner();
            });
        }
< /script>
复制代码

在这个脚本中,我们首先检查Modernizr对象,看它是否支持“borderradius”(这是CSS3的一项特性)。如果不支持,再使用一段jQuery脚本调用jquery.corner.js(前提是先从http://jquery.malsup.com/co

    
[3]五分钟学会HTML5!(一)
    来源: 互联网  发布时间: 2013-11-10

语义标签和页面布局

我们首先讲一个关于一所大学的经典故事。这所大学在建设校园草地时,没有开辟任何步行小道,他们把整个空地种上草,然后等待。
一年以后,人们经常走过的地方,草都被踩光了。于是,这所大学就将这些地方铺设为真正的人行道。

棒极了!这些人行道是人们真正“走”出来的。

HTML5新语义元素的诞生正是基于同样的逻辑。(关于这一点,可以参看W3C设计指南中的“Pave the Cowpaths”。)

语义元素清晰地向浏览器和开发人员表明了它们的涵义和用途,要理解这一点,可以将它们与< div>标签进行对比。在HTML文件内,< div>标签能定义出一个分区或者一个小节,但是它无法告诉我们分区里的内容,不能传达任何清晰的涵义。

开发人员通常会将ID或者类名与< div>标签配合使用,这会向程序员传达更多的涵义。但遗憾的是,这并不能帮助浏览器领会那种标签的用途。< div id="header">

在HTML5中,有不少新的富含语义的元素,可以向浏览器和开发人员传达元素的用途。< header>

W3C挖掘了数亿个的Web页面,找出开发人员一直在使用的ID和类名。一旦开发人员抛出div1、div2这些无意义标签,他们就得到了一个描述非常细致的已经在使用的元素的列表,并让其成为W3C的标准设置。

下面是HTML5的一部分新的语义元素:
• article
• aside
• figcaption
• figure
• footer
• header
• hgroup
• mark
• nav
• section
• time

由于这些元素的语义很丰富,相信你可能会猜出其中大部分元素的作用。
为了说得更清楚,下面给出一张图示。



header和footer的作用不言自明,nav将创造一个导航条或者菜单条。此外,你可以用section和article将页面内容分为几个部分。最后,aside元素用来安置附带的内容,比如说,以边栏的形式放上一些相关链接。

下面是一个简单的例子,其中的代码就用到了这些元素。
            <!DOCTYPE html>
< html>
< head>
    <meta charset="utf-8" />
    <title>Title</title>
    <link href=/blog_article/"css/html5reset.css" rel="stylesheet" />
    <link href=/blog_article/"css/style.css" rel="stylesheet" />
< /head>
< body>
    <header>
        <hgroup>
            <h1>Header in h1</h1>
            <h2>Subheader in h2</h2>
        </hgroup>
    </header>
    <nav>
        <ul>
            <li><a href=/blog_article/"/index.html Option 1</a></li>
            <li><a href=/blog_article/"/index.html Option 2</a></li>
            <li><a href=/blog_article/"/index.html Option 3</a></li>
        </ul>
    </nav>
    <section>
        <article>
            <header>
                <h1>Article #1</h1>
            </header>
            <section>
                This is the first article.  This is <mark>highlighted</mark>.
            </section>
        </article>
        <article>
            <header>
                <h1>Article #2</h1>
            </header>
            <section>
                This is the second article.  These articles could be blog posts, etc. 
            </section>
        </article>
    </section>
    <aside>
        <section>
            <h1>Links</h1>
            <ul>
                <li><a href=/blog_article/"/index.html 1</a></li>
                <li><a href=/blog_article/"/index.html 2</a></li>
                <li><a href=/blog_article/"/index.html 3</a></li>
            </ul>
        </section>
        <figure>
            <img width="85" height="85"
                src=/blog_article/"http_/www_windowsdevbootcamp_com/Images/JennMar.jpg
                alt="Jennifer Marsman" />
            <figcaption>Jennifer Marsman</figcaption>
        </figure>
    </aside>
    <footer>Footer - Copyright 2011</footer>
< /body>
< /html>
复制代码

当然,在这个例子里,我也引出了另外几个新元素。

不知道你是否注意到hgroup元素,它将h1和h2这两个header组合到一起了?

我们可以用mark元素将重要文本高亮显示或标记出来。如果要在内容中插入一张图(图像、图表、照片和代码片段等),可以使用figure元素。而figcaption元素能为图加上标题。当把以上代码和一些CSS代码组合后,得到的Web页面如下图所示。



在一些擅长CSS的朋友(可惜我不擅长CSS)的帮助下,上面这个结果看起来靓爆了!实际上,有了HTML的描述性,完成这个页面非常容易。

还要说明一点,如果你是Visual Studio的拥趸,请确保已经安装了Visual Studio 2010 SP1。否则,你将发现Visual Studio并不理解HTML5元素,从而导致Web页面上到处是歪歪曲曲的线条。

然后,在Visual Studio菜单中依次选择“Tools”-“Options”,打开一个“Options”对话框。从左侧的导航面板,依次展开“Text Editor”和“HTML”,单击“Validation”。在“Target”下拉列表框中选择HTML5,这样就能得到对HTML5 IntelliSense的支持了。



使用Canvas元素在HTML5中进行绘画

HTML5中另外一个新元素是< canvas>标签。顾名思义,它就是一块用来绘画的空白平面。你需要使用JavaScript在这块画布上进行操作和绘画。

你可能需要为canvas元素赋予一个id属性,这样就能通过JavaScript代码以编程的方式访问它。如果你正在使用jQuery,并且在页面上只有一个canvas,你可以使用$(‘canvas’)来访问它,而不用为它命名。

你也可以为canvas指定height(高度)和width(宽度),但这不是必需的。在< canvas> 和< /canvas>标签之间,你还可以指定一些文本,显示在不支持canvas元素的浏览器中。

下面是使用canvas进行绘画的一个简单例子。(我希望画一张苏格兰国旗,如果画得不是非常精确,请见谅。)

< !DOCTYPE HTML>
< html>
< body>
    <canvas id="myCanvas">Your browser does not support the canvas tag.</canvas>
    <script type="text/javascript">

        var canvas = document.getElementById('myCanvas');
        var ctx = canvas.getContext('2d');

        // Draw blue rectangle
        ctx.fillStyle = '#0065BD';
    

    
最新技术文章:
▪error while loading shared libraries的解決方法    ▪版本控制的极佳实践    ▪安装多个jdk,多个tomcat版本的冲突问题
▪简单选择排序算法    ▪国外 Android资源大集合 和个人学习android收藏    ▪.NET MVC 给loading数据加 ajax 等待loading效果
▪http代理工作原理(3)    ▪关注细节-TWaver Android    ▪Spring怎样把Bean实例暴露出来?
▪java写入excel2007的操作    ▪http代理工作原理(1)    ▪浅谈三层架构
▪http代理工作原理(2)    ▪解析三层架构……如何分层?    ▪linux PS命令
▪secureMRT Linux命令汉字出现乱码    ▪把C++类成员方法直接作为线程回调函数    ▪weak-and算法原理演示(wand)
▪53个要点提高PHP编程效率    ▪linux僵尸进程    ▪java 序列化到mysql数据库中
▪利用ndk编译ffmpeg    ▪活用CSS巧妙解决超长文本内容显示问题    ▪通过DBMS_RANDOM得到随机
▪CodeSmith 使用教程(8): CodeTemplate对象    ▪android4.0 进程回收机制    ▪仿天猫首页-产品分类
▪从Samples中入门IOS开发(四)------ 基于socket的...    ▪工作趣事 之 重装服务器后的网站不能正常访...    ▪java序列化学习笔记
▪Office 2010下VBA Addressof的应用    ▪一起来学ASP.NET Ajax(二)之初识ASP.NET Ajax    ▪更改CentOS yum 源为163的源
▪ORACLE 常用表达式    ▪记录一下,AS3反射功能的实现方法    ▪u盘文件系统问题
▪java设计模式-观察者模式初探    ▪MANIFEST.MF格式总结    ▪Android 4.2 Wifi Display核心分析 (一)
▪Perl 正则表达式 记忆方法    ▪.NET MVC 给loading数据加 ajax 等待laoding效果    ▪java 类之访问权限
▪extjs在myeclipse提示    ▪xml不提示问题    ▪Android应用程序运行的性能设计
▪sharepoint 2010 自定义列表启用版本记录控制 如...    ▪解决UIScrollView截获touch事件的一个极其简单有...    ▪Chain of Responsibility -- 责任链模式
▪运行skyeye缺少libbfd-2.18.50.0.2.20071001.so问题    ▪sharepoint 2010 使用sharepoint脚本STSNavigate方法实...    ▪让javascript显原型!
▪kohana基本安装配置    ▪MVVM开发模式实例解析    ▪sharepoint 2010 设置pdf文件在浏览器中访问
▪spring+hibernate+事务    ▪MyEclipse中文乱码,编码格式设置,文件编码格...    ▪struts+spring+hibernate用jquery实现数据分页异步加...
▪windows平台c++开发"麻烦"总结    ▪Android Wifi几点    ▪Myeclipse中JDBC连接池的配置
▪优化后的冒泡排序算法    ▪elasticsearch RESTful搜索引擎-(java jest 使用[入门])...    ▪MyEclipse下安装SVN插件SubEclipse的方法
▪100个windows平台C++开发错误之七编程    ▪串口转以太网模块WIZ140SR/WIZ145SR 数据手册(版...    ▪初识XML(三)Schema
▪CodeSmith 使用教程(8): CodeTemplate对象    ▪android4.0 进程回收机制    ▪仿天猫首页-产品分类 iis7站长之家
▪C++程序的内存布局    ▪将不确定变为确定系列~Linq的批量操作靠的住...    ▪DIV始终保持在浏览器中央,兼容各浏览器版本
▪Activity生命周期管理之三——Stopping或者Restarti...    ▪《C语言参悟之旅》-读书笔记(八)    ▪C++函数参数小结
▪android Content Provider详解九    ▪简单的图片无缝滚动效果    ▪required artifact is missing.
▪c++编程风格----读书笔记(1)    ▪codeforces round 160    ▪【Visual C++】游戏开发笔记四十 浅墨DirectX教程...
▪【D3D11游戏编程】学习笔记十八:模板缓冲区...    ▪codeforces 70D 动态凸包    ▪c++编程风格----读书笔记(2)
▪Android窗口管理服务WindowManagerService计算Activity...    ▪keytool 错误: java.io.FileNotFoundException: MyAndroidKey....    ▪《HTTP权威指南》读书笔记---缓存
▪markdown    ▪[设计模式]总结    ▪网站用户行为分析在用户市场领域的应用
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3