找回密码
 注册
关于网站域名变更的通知
查看: 365|回复: 1
打印 上一主题 下一主题

MATLAB在类中实现static成员变量

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2020-2-13 13:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x

2 d+ M8 U5 g+ y$ {3 f类(class)封装是C++语言最显著的特征!但是很少听说MATLAB中类的概念,这里悄悄的告诉的大家,其实MATLAB也支持面向对象编程,只是使用的人不多而已。
% {8 Y8 T' K3 X+ d" v. z2 K. S( l7 I. B3 ~2 C/ z. G9 Y
对于编写一般简单的数学算法程序,当然基本用不到面向对象编程的概念,所以也就不需要使用MATLAB的类定义了。可是如果应用MATLAB开发具有工程应用型的程序,使用面向对象编程会具有不可比拟的优势。
1 k6 z) s" ~0 r* Y7 L
2 c7 `; x+ g0 [3 q懂C++的朋友应该都知道,C++有一个static成员,static成员是独立于具体的类对象的,是该类所有实例(instance)共享的。这个static成员有什么好处呢?static成员变量是用来存储公共数据的,比如可以用来统计类实例的个数(因为有些类会严格控制实例的个数)或者默认参数(提供某些对象的参数),当然还可以有其它作用,自己发挥吧。static成员函数在不创建类对象的时候直接调用。9 k0 P2 o# i% {- g7 s9 {

8 q, z1 g$ g) Z3 t7 f9 ]很不幸的是MATLAB不支持static成员变量,只能定义static成员函数,于是很多在C++中轻而易取实现的功能,在MATLAB中却成了捉襟见肘!: z7 G6 m" N$ a' @" {% W
* B; O5 m, U, ~7 \1 H
其实软件是死的,人是活的,办法总是有的,下面就来说说。假如我有一个类student,每次生成一个类对象的时候需要对student对象总数进行更新和统计。3 k: |) @' O# D( t) ^% r
  • classdef student
  •   properties
  •      count % 统计student类对象的个数
  •      name % 学生姓名
  •      gender % 性别
  •      math % 数学成绩
  •      chinese % 语文成绩
  •   end
  • end
    4 q# `2 Y" i! ~% G. I: P- S
5 n5 [# R; h" S( Y3 `% ?

, J: e+ X7 _" [. `, h* \5 }上面类定义的count是具体类对象的成员变量,每个类对象的取值都可以不一样的,因此不能用来统计类对象的个数,MATLAB中只有constant变量才是独立于类对象的,于是如下修改
" G* b, |. \4 _* M: w+ a
  • classdef student
  •   properties (Constant)
  •      count % 统计student类对象的个数
  •   end
  •   properties
  •      name % 学生姓名
  •      gender % 性别
  •      math % 数学成绩
  •      chinese % 语文成绩
  •   end
  • end5 q5 E" f, V8 }, n1 J/ J7 C  F' b
" D) d2 @" P5 ]3 i' p, Z
; ]7 `7 Z$ K  b& a8 }0 U/ e
但是问题又来了,constant变量顾名思义,它的值是不能修改的,看来努力还是要白费了??不要灰心一切事情都有转机的,不幸中的万幸,MATLAB提供了句柄类(hande class)这个概念,句柄有点类似于C++中的指针或者引用的概念,但是两者不同,不过偶不介意你将句柄当成MATLAB中的引用。这就让我们依稀看到了黎明的曙光。
3 \2 q. W% Y* @( y+ l& M. L2 v" E3 [
现在假如这个constant变量是一个句柄呢,由于constant变量的值是不能修改,这是铁定的,因此引用哪个变量也是没法修改的,但是没有限定这个引用变量的内容不能修改呀。现在问题又来了,如何创建句柄呢,嗯MATLAB提供了几个超类,其中handle超类是属于句柄型的。好下面我们创建一个句柄类
$ z' `5 K' m9 ]9 f1 _
  • classdef (Sealed) thiscount < handle  % 继承handle超类,这个必须
  •   properties
  •       number=0
  •   end
  •   methods
  •       function obj=thiscount(varargin) % 构造函数
  •      end
  •       function obj=add(varargin)
  •         obj.number=obj.number+1;
  •      end
  •   end
  • end8 p! @9 C6 X, Z# @) r0 \
% ^5 |' j. I, S: d, w
当然需要修改下student类了$ O- T4 e0 {* R: K' t: [$ w4 q
  • classdef student
  •   properties (Constant,Hidden)
  •     count=thiscount; % 统计student类对象的个数,保存了一个用于统计个数的句柄类
  •   end
  •   properties (SetAccess=private)
  •      index % 当前类对象的生成序号
  •   end
  •   properties
  •      name % 学生姓名
  •      gender % 性别
  •      math % 数学成绩
  •      chinese % 语文成绩
  •   end
  •   methods
  •     function  obj=student(varargin)
  •       obj.AddInstance; % 调用构造函数创建student对象时,自动调用AddInstance函数进行类实例个数累加
  •     end
  •     function obj=AddInstance(varargin)
  •        obj.count.add;
  •        obj.index=obj.count.number;
  •     end
  •   end
  • end- |# _* _7 C  q  q. j, s3 o

' B  b" [% G) |5 x& g3 A4 R
/ h1 U2 s# @3 ~7 w$ ]这样你每次创建一个student类,那么会自动统计,我们可以通过student.count.number来显示创建的实例个数,假设创建了一个student类对象sobj,那么可以通过sobj.index来访问当前类对象的创建编号。
8 D) Q( }; {5 l; Y

该用户从未签到

2#
发表于 2020-2-13 18:20 | 只看该作者
MATLAB在类中实现static成员变量
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-11-2 12:29 , Processed in 0.140625 second(s), 24 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

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