首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在MATLAB类中获得静态成员变量?

问如何在MATLAB类中获得静态成员变量?
EN

Stack Overflow用户
提问于 2011-06-23 06:37:10
回答 4查看 16K关注 0票数 15

有方法在MATLAB类中定义静态成员变量吗?

这不管用:

代码语言:javascript
复制
classdef A

    properties ( Static )
        m = 0;
    end
end

它建议使用关键字“常数”而不是“静态”,不能修改常量属性。我想要一个对类A的所有对象通用的变量,并且我希望能够在类A的方法中修改这个变量。

所以我需要的是一个私有的静态成员变量。有办法在MATLAB中获得它吗?

发现,可以使用静态成员函数中的持久变量来解决问题。

在这种情况下,您应该继承基类中的所有类,如下所示。

代码语言:javascript
复制
classdef object < handle

    properties ( GetAccess = 'public', SetAccess = 'private' )
        id
    end

    methods ( Access = 'protected' )
        function obj = object()
            obj.id = object.increment();
        end
    end

    methods ( Static, Access = 'private' )
        function result = increment()
            persistent stamp;
            if isempty( stamp )
                stamp = 0;
            end
            stamp = stamp + uint32(1);
            result = stamp;
        end
    end  
end
EN

Stack Overflow用户

发布于 2011-06-23 11:12:57

你不能,这是故意的。您应该使用一个persistent变量(技术从MATLAB的1980年应用于2011年)!

为了完整起见,我应该提到,实际上在2010 b时,有一个无文档且可能不再支持的static属性修饰符。

有关背景,请参阅这里 戴夫·福提的答案,MATLAB组管理器:

在MATLAB中,类可以定义常量属性,但不能定义其他语言(如C++ )意义上的“静态”属性。有一些测试版对“静态”属性进行了实验,从那时起,没有文档化的属性仍然存在。但是,静态属性是无文档化的,不应该使用,并且很可能在未来的MATLAB版本中被删除。R2008a将其实现为常量的同义词,除了常量属性的记录行为之外,不提供任何额外的功能。 不能从属性声明中指定的初始值更改常量属性。MATLAB的工作方式有几个原因。首先,MATLAB有着长期的规则,变量总是先于函数和类的名称,赋值语句在不存在的情况下引入变量。因此,形式"A.B = C“的任何表达式都将引入一个新的变量A,它是一个包含值为C的字段B的结构数组。如果"A.B = C”可以引用A类的静态属性,则A类将取代变量A,这将是与MATLAB先前版本非常不兼容的。这意味着包含赋值语句"A.B = C“的m文件可以通过在MATLAB路径上引入一个名为A的类来改变其含义。MATLAB程序员一直能够依靠赋值语句引入变量,这些变量隐藏了同名的任何其他用法。 其次,我们注意到静态数据很少用于其他类中,除非作为类中的私有数据或公共常量。例如,对几个Java类库的调查发现,所有公共静态字段也是最终的。在MATLAB中,常量属性可以像Java中的“公共最终静态”字段一样使用。对于类内部的数据,MATLAB已经有了持久性变量,这些变量可以在私有或受保护的方法或类私下使用的本地函数中创建。在可能的情况下,也有很好的理由避免使用MATLAB中的静态数据。如果一个类具有静态数据,那么在多个应用程序中很难使用同一个类,因为静态数据可能是应用程序之间冲突的来源。在其他一些语言中,这不是一个问题,因为不同的应用程序被单独编译成在不同进程中运行的可执行文件,具有不同的类静态数据副本。在MATLAB中,许多不同的应用程序可能在同一个进程和环境中运行,每个类都有一个副本。

票数 16
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6450204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档