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 { //... }分列到现有的三个文件里面就行了。