找回密码
 注册
Simdroid-非首页
查看: 203|回复: 5

对于matlab类和c++类转化的初步认识

[复制链接]
发表于 2008-11-14 15:56:51 | 显示全部楼层 |阅读模式 来自 江苏镇江
最近考虑如何把matlab类和c++类联系起来,实现相互转化,通过实验比较了两种类,做了两个表,关于两种类的区别与联系,请大家多发表意见。

表1.基础知识:
类的准备知识

VC的类

MATLAB的类

类是为了将数据和处理数据的函数封装到一起,类和结构体的区别:结构体能够定义成员变量(数据成员),但是不能定义成员函数,如果需要定义成员函数就需要使用类。
类的声明和实现:
class <类名>
  {
     public://公有成员可以被外部函数访问
    <成员函数或数据成员的说明>
     private://只能被该类的成员函数访问
    <数据成员或成员函数的说明>
  };
     <各个成员函数的实现>
【注意】
如果成员函数已经在类体中定义,则实现部分将不出现。如果在类的外部定义,则必须使用域运算符::来通知编译系统该函数所属的类。在类体中不允许对所定义的数据成员进行初始化。

类定义的方法(以CMyClass类为例):
类的构造函数和成员函数放在work/@ CMyClass文件夹内,构造函数在CMyClass.m中定义;文件夹中其它函数为类的成员函数,不需在构造函数中声明,
1)成员函数必须以类对象作为第一个输入变量,这样matlab才会到相应类目录中寻找该函数(以防不同类有同名的函数)
私有函数放在work/@CMyClass /Private文件夹下,只有该类的成员函数可以访问这个私有函数,在命令行或者类之外的其它函数都不能使用。
2)类的成员函数都是私有,如果要在类的外部访问,需要在类内部创建一个特定的函数供调用。

类的构造函数必须满足:
1)
构造函数与类同名;
2)
构造函数在类文件夹内;
3)
构造函数有下列基本功能:在无输入,本类输入,非本类输入情况下,均应该有合理的新对象的输出;
4)
为类挂上类标签;
5)
确定类的优先级(确定不同类的同名函数调用哪一个);
【注意】
如果把类文件夹设置为当前工作目录,例如把current directory设为work/@ CMyClass1.如果类重载了系统函数,则在这种情况下执行重载函数不会返回期望结果;2.在设置类文件夹为当前目录时,methods()将无法返回期望的结果;3.把当前路径设置为类的上一层路径work,则上面两个问题不再出现。


表2.相互转化:
两种类的转化实例

Matlab

VC

类定义和类的构造函数如下:
work/@CMyClass/ CMyClass
.m
****************************
function d = CMyClass(x,y)
if (nargin == 0)

d.x=0;


d.y=0;


d=class(d,'CMyClass');

elseif (isa(x,'CMyClass'));

d=x;

else

d.x=x;


d.y=y;


d=class(d,'CMyClass');

end
****************************
输出成员变量的成员函数如下:
work/@ CMyClass/ dispmc.m
****************************
function dispmc(d)
fprintf('list class:\n');
fprintf('x=%d\n',d.x);
fprintf('y=%d\n',d.y);
****************************
类的实现:
work
c=CMyClass(12,23);
dispmc(c);


类定义和类的构造函数如下:
MtoC.cpp
****************************
class CMyClass
{
public:

CMyClass(int a,int b);


void dispmc();

private:

int x;


int y;

};
//构造函数
CMyClass::CMyClass(int a,int b)
{

x=a;y=b;}

****************************
输出成员变量的成员函数如下:
****************************
void CMyClass::dispmc()
{

cout<<"\nx="<<x;


cout<<"\ny="<<y;

}
****************************
类的实现:
#include<iostream.h>
void main()
{

CMyClass c(12,23);


c.dispmc();

}
成员变量全是私有;如果要在外部访问成员变量需要编写相应函数;
成员变量可以定义为私有或者公有(保护);
成员函数全是公有;私有需要放到private内;

因为调用格式和VC不同,必须以类作为成员函数的第一个输入参数。
成员函数可以定义私有或者公有(保护);

不需要以类作为成员函数的第一个输入参数。
辨别输入类型和数目实现构造函数重载;
构造函数重载和matlab原理类似;


[ 本帖最后由 lyzero0 于 2008-11-14 21:00 编辑 ]

评分

1

查看全部评分

发表于 2008-11-14 20:03:22 | 显示全部楼层 来自 湖北武汉
Simdroid开发平台
请问楼主所用matlab和vc的版本是?
回复 不支持

使用道具 举报

 楼主| 发表于 2008-11-14 20:16:34 | 显示全部楼层 来自 江苏镇江
原帖由 fighter-11 于 2008-11-14 20:03 发表
请问楼主所用matlab和vc的版本是?

我用的是VC6.0和Matlab6.5,还使用了Visual Assist X。
回复 不支持

使用道具 举报

发表于 2008-11-14 21:58:09 | 显示全部楼层 来自 新加坡
谢谢牛牛分享学习心得。不过有个疑问,为什么不用最新的matlab呢?matlab6.5对宇面向对象的编程技术的支持尚有缺陷,后来的matlab在这方面有不断的加强,比如matlab r2008a就开始支持classdef方式来在一个文件中定义该类的特性和函数,我个人感觉这样更加自然一点,以前的那种把所有的东西分散放在‘@类名’的目录中有点别扭。另外从matlab r2008a和r2008b开始,可以用模板文件来定义新的类,这样也方便了不少。

另外,matlab r2008b中开始有了一个新的类叫做Map,就是由“key”和“value”成对组成的一个容器,很好玩的。
回复 不支持

使用道具 举报

发表于 2008-11-15 00:18:03 | 显示全部楼层 来自 新疆乌鲁木齐
matlab r2008b中开始有了一个新的类叫做Map,就是由“key”和“value”成对组成的一个容器

对,在help中有几个视频,里面介绍了这种类的用法,昨天我刚看的...
回复 不支持

使用道具 举报

 楼主| 发表于 2008-11-15 15:20:25 | 显示全部楼层 来自 江苏镇江
感谢taohe和bainhome的回复,有机会一定试试matlab r2008b的Map容器。help里还有视频,那样学习起来就更快了,呵呵。想了想,原来我这两年都在做“翻译”工作,前年是翻译英文文献,今年是翻译程序,也就是把matlab语言编写的一个程序转换成VC,说实话,我的VC和matlab编程都很初级,通过阅读论坛里面的帖子,自己受益匪浅,比查文献,读期刊还要有效,实践出真知呀。以前看不懂的程序现在可以看懂了,感觉到自己的进步,很高兴,谢谢。
回复 不支持

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|小黑屋|联系我们|仿真互动网 ( 京ICP备15048925号-7 )

GMT+8, 2024-5-23 13:00 , Processed in 0.056067 second(s), 17 queries , Gzip On, MemCache On.

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表