确定namespace substance结构

 

this->main_atom=fragments[0]->main_atom;

 

 

这个操作,会改变fragments[3]的内容?

 

执行之前:

 

 

执行之后:

 

 

而且,fragments[0] 是没有发生变化的。变化的只是fragments[3]。

 

问题会在什么地方呢?

 

 

发现 fragments[3] 被 fragments[0] 赋值了。

那么,this->main_atom 就是指向 fragments[3] 了?

 

返回去看 WinMain:

 

R=new radical("i-Pr");
vR.push_back(R);
R->assemble(vR);

 

 的确如此。

 

重新编译,再发现combine函数里的一处错误:

 

R->free_atoms.erase(R->free_atoms.begin()+n_left);//删除(*R)中被用掉的自由价。

 

太危险了,要是再以后才发现出错,怎么检查得出来是这里的原因啊。

 

改成 +n_right 。再编译,就正常了。

 

接下来该写什么呢?

 

atom 和 radical 类的结构可以确定下来了。但是刚刚冒出来的 substance 名字空间,它和 radical 及 atom 的关系是什么?

首先:namespace substance 是处理分子结构的名字空间。radical 是表示基团结构的类,atom 是表示原子的类。这两个类实际上描述了 substance 的数据结构。他们该不该属于 substance?

我没有经验,就参照std 名字空间的结构吧。

 

怪了!std名字空间的定义在哪里?就是这样一句 namespace std{/*...*/}出现在哪里?为什么我们使用的时候都是包含头文件之后还要using std::/*..*/?这是说像basic_string类的定义实际上是在namespace std里面的。

把/include/XSTRING打开,发现有如下内容:

// xstring internal header (from <string>)

#if     _MSC_VER > 1000
#pragma once
#endif

#ifndef _XSTRING_
#define _XSTRING_
#include <xmemory>

#ifdef  _MSC_VER
#pragma pack(push,8)
#endif  /* _MSC_VER */
 #include <xutility>
_STD_BEGIN
_CRTIMP void __cdecl _Xlen();
_CRTIMP void __cdecl _Xran();
		// TEMPLATE CLASS basic_string

 这里这个_STD_BEGIN是什么?用关键字 ("_STD_BEGIN" -"baidu" -"tianya") Google搜索,

然后我就发现了这篇帖子:http://topic.csdn.net/u/20091128/17/634098f6-7f55-496f-9df3-b1831623ddda.html

 

Loaden 和 tercel2009 说得很清楚,

#define _STD_BEGIN namespace std {
#define _STD_END }

 出现在yvals.h中。

		/* NAMESPACE */
 #if defined(__cplusplus)
  #define _STD			std::
  #define _STD_BEGIN	namespace std {
  #define _STD_END		};
  #define _STD_USING
 #else
  #define _STD			::
  #define _STD_BEGIN
  #define _STD_END
 #endif /* __cplusplus */

 这是yvals.h中的相关代码。

 

那这样看来,string的定义实际上是这样的:

1.

namespace std{
        // basic_string TEMPLATE OPERATORS
template<class _E, class _Tr, class _A> inline
    basic_string<_E, _Tr, _A> __cdecl operator+(
        const basic_string<_E, _Tr, _A>& _L,
        const basic_string<_E, _Tr, _A>& _R)
    {return (basic_string<_E, _Tr, _A>(_L) += _R); }
//...
}

 2.

//...
namespace std {
//...
template<class _E,
	class _Tr = char_traits<_E>,
	class _A = allocator<_E> >
	class basic_string {
public:
	//...
protected:
	//...
private:
	//...
	};
//...
template<class _E, class _Tr, class _A>
	const basic_string<_E, _Tr, _A>::size_type
		basic_string<_E, _Tr, _A>::npos = -1;
//...

typedef basic_string<char, char_traits<char>, allocator<char> >
	string;

typedef basic_string<wchar_t, char_traits<wchar_t>,
	allocator<wchar_t> > wstring;

}

 参考到 namespace substance ,我应该把radical、atom的定义放在namespace substance 的定义里面。数据结构 和 功能实现 不分离:

namespace substance
{
	class atom
	{
		//...
	};
}
namespace substance
{
	class radical
	{
		//...
	};
}
namespace substance
{
	//...
}
 分列到现有的三个文件里面就行了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值