课程咨询 :18087159764

  • 广州C++培训: Strong Pointers

    发布:广州C++培训      来源:达内新闻      时间:2016-11-22

  • 广州C++培训: Strong Pointers

    资源管理在内容索引(Windows NT Server上的一部分,现在是Windows 2000)上工作,并且,我对这十分满意。然后我开始想……这一方法是在这样一个完整的系统中形成的,如果可以把它内建入语言的本身岂不是一件非常好?我提出了强指针(Strong Pointer)和弱指针(Weak Pointer)。一个Strong Pointer会在许多地方和我们这个SmartPointer相似--它在超出它的作用域后会清除他所指向的对象。资源传递会以强指针赋值的形式进行。也可以有Weak Pointer存在,它们用来访问对象而不需要所有对象--比如可赋值的引用。

    任何指针都必须声明为Strong或者Weak,并且语言应该来关注类型转换的规定。例如,你不可以将Weak Pointer传递到一个需要Strong Pointer的地方,但是相反却可以。Push方法可以接受一个Strong Pointer并且将它转移到Stack中的Strong Pointer的序列中。Pop方法将会返回一个Strong Pointer。把Strong Pointer的引入语言将会使垃圾回收成为历史。

    这里还有一个小问题--修改C++标准几乎和竞选美国总统一样容易。当我将我的注意告诉给Bjarne Stroutrup的时候,他看我的眼神好像是我刚刚要向他借一千美元一样。

    然后我突然想到一个念头。我可以自己实现Strong Pointers。毕竟,它们都很想Smart Pointers。给它们一个拷贝构造函数并重载赋值操作符并不是一个大问题。事实上,这正是标准库中的auto_ptr有的。重要的是对这些操作给出一个资源转移的语法,但是这也不是很难。

    template

    SmartPointer::SmartPointer (SmartPointer & ptr)

    {

    _p = ptr.Release ();

    }

    template

    void SmartPointer::operator = (SmartPointer & ptr)

    {

    if (_p != ptr._p)

    {

    delete _p;

    _p = ptr.Release ();

    }

    }

    使这整个想法迅速成功的原因之一是我可以以值方式传递这种封装指针!我有了我的蛋糕,并且也可以吃了。看这个Stack的新的实现:

    class Stack

    {

    enum { maxStack = 3 };

    public:

    Stack ()

    : _top (0)

    {}

    void Push (SmartPointer & item) throw (char *)

    {

    if (_top >= maxStack)

    throw "Stack overflow";

    _arr [_top++] = item;

    }

    SmartPointer Pop ()

    {

    if (_top == 0)

    return SmartPointer ();

    return _arr [--_top];

    }

    private

    int _top;

    SmartPointer _arr [maxStack];

    };

    Pop方法强制客户将其返回值赋给一个Strong Pointer,SmartPointer。任何试图将他对一个普通指针的赋值都会产生一个编译期错误,因为类型不匹配。此外,因为Pop以值方式返回一个Strong Pointer(在Pop的声明时SmartPointer后面没有&符号),编译器在return时自动进行了一个资源转换。他调用了operator =来从数组中提取一个Item,拷贝构造函数将他传递给调用者。调用者最后拥有了指向Pop赋值的Strong Pointer指向的一个Item。

    我马上意识到我已经在某些东西之上了。我开始用了新的方法重写原来的代码。

上一篇:广州C++培训: Resource Transfer

下一篇:广州C++培训:Parser

最新开班日期  |  更多

c++--零基础周末班

c++--零基础周末班

开班日期:6月30日

c++--零基础全日制班

c++--零基础全日制班

开班日期:6月30日

c++--免费训练营

c++--免费训练营

开班日期:6月30日

c++--高薪就业班

c++--高薪就业班

开班日期:6月30日

  • 网址:http://gz.c.tedu.cn     地址:广州市天河北五山路 141 号尚德大厦 627
  • 课程培训电话:18087159764     全国服务监督电话:400-111-8989
  • 服务邮箱 tousu@tedu.cn
  • 2001-2016 达内时代科技集团有限公司 版权所有 京ICP证8000853号-56