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