`
后生姓王
  • 浏览: 26463 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

确定namespace substance结构

    博客分类:
  • C++
阅读更多

 

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
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics