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
{
//...
}
分列到现有的三个文件里面就行了。
分享到:
相关推荐
Allegorithmic Substance Painter 用户手册
Substance贴图工具Allegorithmic Substance Designer 5.3.4 build 17162 (x64);Substance贴图工具Allegorithmic Substance Designer 5.3.4 build 17162 (x64)
Substance Designer 曲线程序插件,非常强大,内有demo示例
substance5.2.jar substance swing 皮肤
最新版的substance6.0 http://java.net/projects/substance
substance-6.0.jar substance-6.0-sources.jar Substance Look and Feel
substance的正确使用
Substance in Unity
substance类
Substance Painter教程合集 - Substance Painter Tutorial
swing substance 实例集合,打开之后,会去网上自动下载的,该实例包含了所有的substance的效果,Java的CS不再丑陋啦!!
Substance Designer 所有的纹理工作的首选工具,无论你是游戏或动画/视觉特效工作。世界各地的众多,久负盛名的 和整体的大工作室已经选择在其管道中的枢纽,并有充分理由: Substance Designer包括专用和授权的功能...
Substance Designer是为那些想创造更多的美术作品,但是拥有较少的时间和为数不多的软件选择的3D艺术家而设计的一个全面工具。 part1: https://download.csdn.net/download/qq738255988/10424874 part2: ...
substance+swing完整案例,包括substance的jar包及一个完整的例子,之前找了很久,为方便大家,提供了一个简单例子。
Allegorithmic Substance Painter 用户手册 | Substance Painter 官方文档
substance材质:1.6GB的substance painter材质,通过百度网盘自己下载,可以一起交流心得。
swing substance 最新发布包,用substance 写Java的CS程序,效果很好
Allegorithmic Substance Designer 用户手册
swing漂亮皮肤Substance6.0,源码和jar相关library全,开源,官方网站下载整理。吐血推荐