找回密码
 注册
查看: 3954|回复: 2

[转载]如何用一个IOobject对象来构造一个IOdictionary对象

[复制链接]
发表于 2009-2-10 23:51:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
如何用一个IOobject对象来构造一个IOdictionary对象


经常会看到下面这样的代码:
IOdictionary controlDic_
  (
   IOobject
   (
      “nameString”,
      runTime.timeName(),
      mesh,
      IOobject::MUST_READ,
      IOobject::AUTO_WRITE
   )
  );
这段代码的意思就是要用一个IOobject对象来构造一个IOdictionary对象。就是以IOobject构造的临时对象为实参来调用IOdictionary的以IOobject为形参的构造函数,那么该构造是如何完成的呢,下面让我们来分析一下其实现源代码:
IOdictionary::IOdictionary    //代码段1
(
     const IOobject& io
)
:
     regIOobject(io)    <==//Line1
{
    dictionary::name() = IOobject:bjectPath();

    if
    (
        io.readOpt() == IOobject::MUST_READ
     || (io.readOpt() == IOobject::READ_IF_PRESENT && headerOk())
    )
    {
        readStream(typeName) >> *this;  <==//Line2
        close();
    }
}
从中可以看出,该类构造在初始化列表中首先调用了其基类regIOobject的构造。那么regIOobject又是如何从IOobject对象构造的呢?让我们看一下regIOobject的构造函数实现源代码:
regIOobject::regIOobject(const IOobject& io)
:
     IOobject(io),
     registered_(false),
     registries_(false),
     lastModified_(0),
    updated_(false),
    isPtr_(NULL)
{
    // Register with objectRegistry if requested
    if (registerObject())
    {
        checkIn();
    }
}
注意其中的红色代码,第一个调用IOobject的复制构造,第二个调用IOobject公有成员函数registerObject(),第三个调用注册函数checkIn()。
首先来看看IOobject的复制构造,在IOobject的声明及定义中并没有为该类提供复制构造,因而这种情况下编译器将自动创建一个,完成所有成员变量的复制。
接着看看registerObject(),它要完成的判断是否该IOobject对象含有注册标记(registerObject_=true)。
checkIn()的实现中最关键的代码为db().checkIn(*this),这将调用io的对象注册器(db_)的函数checkIn(当前regIOobject) 完成当前对象在对象注册器中的注册,如果注册成功则registered_=true。
其它代码只是完成私有变量的默认初始化工作,
registered_=false;  //默认情况下一个新建的regIOobject是没有被注册的
registries_=false;  //默认情况下一个新建的regIOobject是不被任何注册器拥有的
lastModified_=0;  //默认情况下一个新建的regIOobject没有上次修改时间
updated_=false;  //默认情况下一个新建的regIOobject没有被更新,在后续版本中被废除了(ver1.3中不再有该变量)
isPtr_=NULL;   //默认情况下一个新建的regIOobject所关联的数据文件的指针初始化为NULL
这些私有变量中除了registered_在checkIn()调用中被设置外,其它变量均保持构造时原默认值,这些变量值的改变是在IOdictionary的构造中实现的见其构造函数实现代码“代码段1”。其中代码readStream(typeName)调用regIOobject的成员函数实参typeName="dictionary",而当isPtr_=NULL时该函数又将首先调用readStream()函数,readStream()主要完成两个任务:
调用IOobject的成员函数objectStream(),将该对象对应的文件读入内存,并将该内存的指针赋值给regIOobject的isPtr_成员;
给lastModified_赋值为lastModified(objectPath()),即指出读入的文件上次被修改的时间

registries_变量是通过transferToRegistry()函数设置为true的,也就是IOobject对象自身实现其在注册器中的所有权,该函数完成对象所有权从自身移交给对象注册器的功能。

至此,用一个IOobject对象完成regIOobject对象的构造已经完成,即 “代码段1”的“//Line1”已经完成。
构造好IOdictionary的regIOobject部分后,构造函数体内主要完成其dictionary部分的构造,核心代码为“//Line2”,这里调用readStream("dictionary")后将返回对象相应的文件构造的Istream* isTemp,然后调用dictionary的友元输入操作符函数
  Istream& operator>>(Istream& is, dictionary& dict);
从isTemp中读取并构造IOdictionary中的dictionary部分。
这样一个IOdictionary就基本上构造完成了!

转自http://blog.pfan.cn/bioexplore/38123.html
发表于 2009-3-10 15:24:15 | 显示全部楼层
呵呵,版主还把俺的文章拿来了。
 楼主| 发表于 2009-3-10 22:23:42 | 显示全部楼层
呵呵,高人.你也写得的却很牛
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表