IReferenceCounted.h

/*

* IReferenceCounted.h

*

* Created on: 2010-10-11

* Author: Mido

* 计数统计,基类

* - 来自于大哥irrlicht

*/

 

#ifndef IREFERENCECOUNTED_H_

#define IREFERENCECOUNTED_H_

 

#include "IrrTypes.h"

 

namespace irrlight

{

 

//! Base class of most objects of the IrrLight Engine.

/** This class provides reference counting through the methods grab() and drop().

It also is able to store a debug string for every instance of an object.

Most objects of the IrrLight

Engine are derived from IReferenceCounted, and so they are reference counted.

 

When you create an object in the IrrLight engine, calling a method

which starts with 'create', an object is created, and you get a pointer

to the new object. If you no longer need the object, you have

to call drop(). This will destroy the object, if grab() was not called

in another part of you program, because this part still needs the object.

Note, that you only need to call drop() to the object, if you created it,

and the method had a 'create' in it.

 

A simple example:

 

If you want to create a texture, you may want to call an imaginable method

IDriver::createTexture. You call

ITexture* texture = driver->createTexture(dimension2d<s32>(128, 128));

If you no longer need the texture, call texture->drop().

 

If you want to load a texture, you may want to call imaginable method

IDriver::loadTexture. You do this like

ITexture* texture = driver->loadTexture("example.jpg");

You will not have to drop the pointer to the loaded texture, because

the name of the method does not start with 'create'. The texture

is stored somewhere by the driver.

*/

class IReferenceCounted

{

public:

 

//! Constructor.

IReferenceCounted()

: ReferenceCounter(1), DebugName(0)

{

}

 

//! Destructor.

virtual ~IReferenceCounted()

{

}

 

//! Grabs the object. Increments the reference counter by one.

/** Someone who calls grab() to an object, should later also

call drop() to it. If an object never gets as much drop() as

grab() calls, it will never be destroyed. The

IReferenceCounted class provides a basic reference counting

mechanism with its methods grab() and drop(). Most objects of

the IrrLight Engine are derived from IReferenceCounted, and so

they are reference counted.

 

When you create an object in the IrrLight engine, calling a

method which starts with 'create', an object is created, and

you get a pointer to the new object. If you no longer need the

object, you have to call drop(). This will destroy the object,

if grab() was not called in another part of you program,

because this part still needs the object. Note, that you only

need to call drop() to the object, if you created it, and the

method had a 'create' in it.

 

A simple example:

 

If you want to create a texture, you may want to call an

imaginable method IDriver::createTexture. You call

ITexture* texture = driver->createTexture(dimension2d<s32>(128, 128));

If you no longer need the texture, call texture->drop().

If you want to load a texture, you may want to call imaginable

method IDriver::loadTexture. You do this like

ITexture* texture = driver->loadTexture("example.jpg");

You will not have to drop the pointer to the loaded texture,

because the name of the method does not start with 'create'.

The texture is stored somewhere by the driver. */

any grab() const { ++ReferenceCounter; }

 

//! Drops the object. Decrements the reference counter by one.

/** The IReferenceCounted class provides a basic reference

counting mechanism with its methods grab() and drop(). Most

objects of the IrrLight Engine are derived from

IReferenceCounted, and so they are reference counted.

 

When you create an object in the IrrLight engine, calling a

method which starts with 'create', an object is created, and

you get a pointer to the new object. If you no longer need the

object, you have to call drop(). This will destroy the object,

if grab() was not called in another part of you program,

because this part still needs the object. Note, that you only

need to call drop() to the object, if you created it, and the

method had a 'create' in it.

 

A simple example:

 

If you want to create a texture, you may want to call an

imaginable method IDriver::createTexture. You call

ITexture* texture = driver->createTexture(dimension2d<s32>(128, 128));

If you no longer need the texture, call texture->drop().

If you want to load a texture, you may want to call imaginable

method IDriver::loadTexture. You do this like

ITexture* texture = driver->loadTexture("example.jpg");

You will not have to drop the pointer to the loaded texture,

because the name of the method does not start with 'create'.

The texture is stored somewhere by the driver.

/return True, if the object was deleted. */

bool drop() const

{

// someone is doing bad reference counting.

//_IRR_DEBUG_BREAK_IF(ReferenceCounter <= 0) // ڶ��ԡ��?����ָȡ��.Mido.2010.9.27

 

--ReferenceCounter;

if (!ReferenceCounter)

{

delete this;

return true;

}

 

return false;

}

 

//! Get the reference count.

/** /return Current value of the reference counter. */

s32 getReferenceCount() const

{

return ReferenceCounter;

}

 

//! Returns the debug name of the object.

/** The Debugname may only be set and changed by the object

itself. This method should only be used in Debug mode.

/return Returns a string, previously set by setDebugName(); */

const c8* getDebugName() const

{

return DebugName;

}

 

protected:

 

//! Sets the debug name of the object.

/** The Debugname may only be set and changed by the object

itself. This method should only be used in Debug mode.

/param newName: New debug name to set. */

any setDebugName(const c8* newName)

{

DebugName = newName;

}

 

private:

//! The reference counter. Mutable to do reference counting on const objects.

mutable s32 ReferenceCounter;

//! The debug name.

const c8* DebugName;

};

 

} // end namespace IrrLight

 

#endif /* IREFERENCECOUNTED_H_ */

 

 

 

本文来自:鬼火神灯 - irrlight.com

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值