|
这里展示了一个例子问题,注意,只不过是一个例子。
问题是:“如何计算矩阵乘法:A = A * B ”。
目的当然不是计算矩阵乘法,所以你有必要把它想象成一个大型项目的系统。
如果“运算过程”不面向对象,通常是这么做的:
#include "inst3DMath.h"
void Mat44MulMat44(MAT44 *ret, const MAT44 *mat1, const MAT44 *mat2)
{
ZeroMemory(ret,sizeof(MAT44));
for(Int32 i=0;i<=3;i++)
for(Int32 j=0;j<=3;j++)
for(Int32 s=0;s<=3;s++)
ret->m[j] += mat1->m * mat2->m[j];
}
Mat44MulMat44( &result, &A, &B );
Copy( &A, &result );
或者,可读性更高的,可以写成:
void Mat44MulMat44(MAT44 *ret, const MAT44 *mat1, const MAT44 *mat2)
{
for(Int32 i=0;i<=3;i++)
for(Int32 j=0;j<=3;j++)
{
Float tmp = 0;
for(Int32 s=0;s<=3;s++)
tmp += mat1->m * mat2->m[j];
ret[j] = tmp;
}
}
Mat44MulMat44( &result, &A, &B );
Copy( &A, &result );
但是,如果像下面这么做,就错了:
void Mat44MulMat44(MAT44 *mat1, const MAT44 *mat2)
{
for(Int32 i=0;i<=3;i++)
for(Int32 j=0;j<=3;j++)
{
Float tmp = 0;
for(Int32 s=0;s<=3;s++)
tmp += mat1->m * mat2->m[j];
mat1[j] = tmp;
}
}
Mat44MulMat44( &A, &B );
-------------------------------------------------------------------------
“这当然!楼主当我是XX吗!?原来楼主就是要给我看这种垃圾帖子啊!”
----你这么抱怨说。。。
-------------------------------------------------------------------------
现在让我们想象,这是一个大型项目中的复杂系统,每个矩阵元素都是一个小系统,
每个元素,都有自己的属性,方法。。。。这看起来多么美妙。。。。
#include <instDefines.h>
class CElement:virtual public IDynamic
{
private:
Int32 m_i,m_j; //记录自己的编号!“有效利用了面向对象的封装”
Float m_Value;
public: //你可以无视这两行
virtual void *GetAddr()const{ return (void *)this; }
virtual CStr GetClass()const{ return L"CElement"; }
public:
Float Read()const{ return m_Value; }
void DoSomething( Int32 j );
};
现在,名称有所改变,那个函数改成了2个函数,“DoSystem”和“DoSomething”,
矩阵改成了"system1,2"。。。因为这是一个大型项目的复杂系统。。。
CElement * * *system1, * * *system2; // 直接用Global - 简单起见
void DoSystem()
{
for(Int32 i=0;i<=3;i++)
for(Int32 j=0;j<=3;j++)
{
system1[j] -> DoSomething(); //需要让系统1的元素[j]做一个事情。
}
}
void CElement: oSomething()
{
Float tmp = 0;
for(Int32 s=0;s<=3;s++)
tmp += system1[m_i]->Read() * system2[m_j]->Read();
m_Value = tmp ;
}
现在我们调用 DoSystem();
然后,程序并没有获得你想要的那个结果,事实上,
它等于就是崩溃了。。。
在一个大型项目的测试中,你会很讨厌这种错误,并且硬编码来修正它。
参考:http://bbs.gameres.com/showthread.asp?threadid=106038
请警惕这种错误吧!不要被面向对象所迷惑!
|
|