Difference between revisions of "Classdef"

From Octave
Jump to navigation Jump to search
Line 141: Line 141:
 
** SetAccess (public/private/protected)
 
** SetAccess (public/private/protected)
  
==== Classdef examples in the wild ====
+
=== Open Bug Reports ===
 +
 
 +
* Delete method for handle classes
 +
 
 +
** [https://savannah.gnu.org/bugs/?46497 46497] classdef: delete destructor method is not called when clearing handle class
 +
** [https://savannah.gnu.org/bugs/?53844 53844] handle class: delete destructor method cannot access class properties
 +
 
 +
* Function handles and classdef methods
 +
 
 +
** [https://savannah.gnu.org/bugs/?48802 48802] function overload resolution on function handles fails on classdef methods defined in class body
 +
** [https://savannah.gnu.org/bugs/?46659 46659] classdef: cannot create handles to functions in +package
 +
** [https://savannah.gnu.org/bugs/?45351 45351] function handles to classdef methods not supported
 +
** [https://savannah.gnu.org/bugs/?51709 51709] Creating function handle to static methods
 +
** [https://savannah.gnu.org/bugs/?47680 47680] classdef @ operator to overrided superclass methods
 +
 
 +
* Issues with basic classdef functionality
 +
 
 +
** [https://savannah.gnu.org/bugs/?42510 42510] methods() does not return functions defined in classdef file
 +
** [https://savannah.gnu.org/bugs/?51659 51659] Calling 'methods' on self causes syntax error
 +
** [https://savannah.gnu.org/bugs/?53614 53614] classdef properties() function not implemented
 +
** [https://savannah.gnu.org/bugs/?46387 46387] Display class properties
 +
** [https://savannah.gnu.org/bugs/?48682 48682] print_usage fails within classdef block
 +
** [https://savannah.gnu.org/bugs/?55223 55223] can't subsasgn with 2-level index (curly braces + parentheses) with classdef handle
 +
** [https://savannah.gnu.org/bugs/?49434 49434] which returns "built-in function" for classdef m-file
 +
** [https://savannah.gnu.org/bugs/?48041 48041] classdef: `help myclass` messes up `help @myclass/method`
 +
** [https://savannah.gnu.org/bugs/?43047 43047] help() does not see classdef files
 +
** [https://savannah.gnu.org/bugs/?42620 42620] exist() does not use "class" argument
 +
** [https://savannah.gnu.org/bugs/?53874 53874] doc_cache_create doesnt handle classdef documentation
 +
** [https://savannah.gnu.org/bugs/?52096 52096] meta.class.fromName throws error when class name not found.
 +
** [https://savannah.gnu.org/bugs/?51377 51377] Parse error for abstract methods
 +
** [https://savannah.gnu.org/bugs/?45457 45457] Incorrect behavior of constant classdef properties referencing other constant properties in the same block
 +
** [https://savannah.gnu.org/bugs/?44665 44665] error in concatenation of classdef objects
 +
** [https://savannah.gnu.org/bugs/?44582 44582] classdef: missing support for enumeration
 +
** [https://savannah.gnu.org/bugs/?44036 44036] interpreter does not recognize classdef (syntax error)
 +
** [https://savannah.gnu.org/bugs/?48693 48693] classdef subsref method is not called with correct nargout value
 +
 
 +
* Classdef and +package directories
 +
 
 +
** [https://savannah.gnu.org/bugs/?54941 54941] interpreter cannot find methods in files of classdefs in packages
 +
** [https://savannah.gnu.org/bugs/?54273 54273] Can't access properties of class in package in function defined in class
 +
 
 +
* Arrays of classdef objects
 +
 
 +
** [https://savannah.gnu.org/bugs/?53906 53906] Cannot make an object array with square brackets
 +
** [https://savannah.gnu.org/bugs/?47755 47755] Access to object arrays
 +
** [https://savannah.gnu.org/bugs/?47241 47241] classdef: assigning property of handle object in object array constructs new object
 +
 
 +
* I/O issues
 +
 
 +
** [https://savannah.gnu.org/bugs/?55497 55497] No or wrong default file name when saving a classdef file
 +
** [https://savannah.gnu.org/bugs/?45833 45833] support load/save of classdef objects
 +
 
 +
* Debugger
 +
 
 +
** [https://savannah.gnu.org/bugs/?46451 46451] unable to set breakpoints within classdef classes
 +
** [https://savannah.gnu.org/bugs/?45404 45404] Breakpoints cannot be set in classdef methods or +package function files
 +
 
 +
* Lower-priority issues ====
 +
 
 +
** [https://savannah.gnu.org/bugs/?55488 55488] Invalid use of colon char as classdef function's argument when subsref is overwritten
 +
** [https://savannah.gnu.org/bugs/?55487 55487] ismethod of custom classdefs always returning false
 +
** [https://savannah.gnu.org/bugs/?54966 54966] Error when assigning array to an object implementing subsasgn() subscripted using "{}"
 +
** [https://savannah.gnu.org/bugs/?54783 54783] subsasgn call when the subscripted expression contains the end keyword
 +
** [https://savannah.gnu.org/bugs/?54028 54028] copy of non-handle class instance is not deep
 +
** [https://savannah.gnu.org/bugs/?53811 53811] cellfun does not find overloaded function with function name argument
 +
** [https://savannah.gnu.org/bugs/?52989 52989] classdef: missing error messages on multiply defined properties
 +
** [https://savannah.gnu.org/bugs/?52614 52614] setting properties of classdef object during construction with inheritance
 +
** [https://savannah.gnu.org/bugs/?52582 52582] Dependent constant properties in classdef errors: no such file
 +
** [https://savannah.gnu.org/bugs/?52123 52123] Indirect memory leak in cdef_manager::initialize ()
 +
** [https://savannah.gnu.org/bugs/?51285 51285] max_recursion_depth error in classdef constructor
 +
** [https://savannah.gnu.org/bugs/?50395 50395] subclassing a class that is also defined as a variable fails
 +
** [https://savannah.gnu.org/bugs/?50011 50011] failure to report error on conflicting methods for classdef
 +
** [https://savannah.gnu.org/bugs/?49379 49379] classdef constructor: .argn. loses first argument, inputname(n) returns inputname(n+1)
 +
** [https://savannah.gnu.org/bugs/?46652 46652] whos bytes property not right for classdef classes
 +
** [https://savannah.gnu.org/bugs/?45893 45893] classdef properties are not reloaded when file is updated
 +
** [https://savannah.gnu.org/bugs/?44934 44934] classdef parser prints extra newline when failing to parse bad classdef file
 +
** [https://savannah.gnu.org/bugs/?44643 44643] classdef handle object can go into an recursive loop with isequal(obj1,obj2) if both are self-referential
 +
** [https://savannah.gnu.org/bugs/?44035 44035] classdef is unable to to subclass double
 +
 
 +
* Documentation
 +
 
 +
** [https://savannah.gnu.org/bugs/?50729 50729] Improve OOP documentation
 +
** [https://savannah.gnu.org/bugs/?47908 47908] Octave:classdef-to-struct not documented in warning_ids.m
 +
** [https://savannah.gnu.org/bugs/?44590 44590] More documentation for the current status of classdef implementation
 +
 
 +
=== Classdef examples in the wild ===
  
 
* http://hg.savannah.gnu.org/hgweb/octave/file/tip/scripts/general/inputParser.m
 
* http://hg.savannah.gnu.org/hgweb/octave/file/tip/scripts/general/inputParser.m

Revision as of 10:37, 23 January 2019

This page is a stub. We should begin documenting what classdef is implemented and what is not.

Not Supported

  • enumeration

See #44582 and help implementing it.


  • build-in class as superclass
classdef nonsense < uint32

end

See #44035

Example:

classdef MyClass < handle
end

c = MyClass();
cc = [c, c];   % won't work

For now you can use a cell-array of objects instead:

cc = {c, c};   % ok

Also see #44665

Example:

classdef MyClass < handle
    properties (SetAccess = immutable)
        x
    end
    methods
        function obj = MyClass()
            x = rand();
        end
    end
end

Use "private" properties as workaround.


  • Function handles to package methods and static class methods.

For example if we have +mypackage/myfunc.m, creating a function handle as fh = @mypackage.myfunc won't work. As a workaround, we can create an indirection using an anonymous function fh = @(varargin) mypackage.myfunc(varargin{:}). Similarly for static class methods where fh = @MyClass.myfunc isn't yet supported. Another workaround for package function handles is to use str2func, e.g. fh = str2func ("mypackage.myfunc").

A fuller example is also given below:

classdef method_function_handle_test

%  properties
%  
%  
%  end
  
  properties (Hidden, SetAccess = protected)
    hfoo = [];% handle to function
  end
  
  methods
  
    function self = method_function_handle_test ()
      self.hfoo = @foo;    
    end
    
    function bar (self)
        self.hfoo (self); 
    end

  end
  
  methods (Hidden, Access = protected)
    function foo (self)
      disp ('hello!');
    end
  end

end

Then running:

>> x = method_function_handle_test
error: @foo: no function and no method found
error: called from
    method_function_handle_test at line 17 column 17
stopped in <****>/scratch/mfiles/octave_tests/method_function_handle_test.m at line 17
17:       self.hfoo = @foo;

See #45351

For example, the following code gives a syntax/parse error:

classdef MyClass
    methods
        function obj = MyClass()
            myfunc()
        end
    end
end

function myfunc()
    disp('myfunc')
end

See #41723.

  • debugging in classdef methods (and +package directory functions)

Breakpoints cannot currently be set in classdef methods from the gui, but only from the command line:

dbstop @aclass\amethod

See #45404

  • Saving/reading classdef objects to/from (.mat) file

Supported

  • methods
    • static
    • private
  • properties
    • SetAccess (public/private/protected)

Open Bug Reports

  • Delete method for handle classes
    • 46497 classdef: delete destructor method is not called when clearing handle class
    • 53844 handle class: delete destructor method cannot access class properties
  • Function handles and classdef methods
    • 48802 function overload resolution on function handles fails on classdef methods defined in class body
    • 46659 classdef: cannot create handles to functions in +package
    • 45351 function handles to classdef methods not supported
    • 51709 Creating function handle to static methods
    • 47680 classdef @ operator to overrided superclass methods
  • Issues with basic classdef functionality
    • 42510 methods() does not return functions defined in classdef file
    • 51659 Calling 'methods' on self causes syntax error
    • 53614 classdef properties() function not implemented
    • 46387 Display class properties
    • 48682 print_usage fails within classdef block
    • 55223 can't subsasgn with 2-level index (curly braces + parentheses) with classdef handle
    • 49434 which returns "built-in function" for classdef m-file
    • 48041 classdef: `help myclass` messes up `help @myclass/method`
    • 43047 help() does not see classdef files
    • 42620 exist() does not use "class" argument
    • 53874 doc_cache_create doesnt handle classdef documentation
    • 52096 meta.class.fromName throws error when class name not found.
    • 51377 Parse error for abstract methods
    • 45457 Incorrect behavior of constant classdef properties referencing other constant properties in the same block
    • 44665 error in concatenation of classdef objects
    • 44582 classdef: missing support for enumeration
    • 44036 interpreter does not recognize classdef (syntax error)
    • 48693 classdef subsref method is not called with correct nargout value
  • Classdef and +package directories
    • 54941 interpreter cannot find methods in files of classdefs in packages
    • 54273 Can't access properties of class in package in function defined in class
  • Arrays of classdef objects
    • 53906 Cannot make an object array with square brackets
    • 47755 Access to object arrays
    • 47241 classdef: assigning property of handle object in object array constructs new object
  • I/O issues
    • 55497 No or wrong default file name when saving a classdef file
    • 45833 support load/save of classdef objects
  • Debugger
    • 46451 unable to set breakpoints within classdef classes
    • 45404 Breakpoints cannot be set in classdef methods or +package function files
  • Lower-priority issues ====
    • 55488 Invalid use of colon char as classdef function's argument when subsref is overwritten
    • 55487 ismethod of custom classdefs always returning false
    • 54966 Error when assigning array to an object implementing subsasgn() subscripted using "{}"
    • 54783 subsasgn call when the subscripted expression contains the end keyword
    • 54028 copy of non-handle class instance is not deep
    • 53811 cellfun does not find overloaded function with function name argument
    • 52989 classdef: missing error messages on multiply defined properties
    • 52614 setting properties of classdef object during construction with inheritance
    • 52582 Dependent constant properties in classdef errors: no such file
    • 52123 Indirect memory leak in cdef_manager::initialize ()
    • 51285 max_recursion_depth error in classdef constructor
    • 50395 subclassing a class that is also defined as a variable fails
    • 50011 failure to report error on conflicting methods for classdef
    • 49379 classdef constructor: .argn. loses first argument, inputname(n) returns inputname(n+1)
    • 46652 whos bytes property not right for classdef classes
    • 45893 classdef properties are not reloaded when file is updated
    • 44934 classdef parser prints extra newline when failing to parse bad classdef file
    • 44643 classdef handle object can go into an recursive loop with isequal(obj1,obj2) if both are self-referential
    • 44035 classdef is unable to to subclass double
  • Documentation
    • 50729 Improve OOP documentation
    • 47908 Octave:classdef-to-struct not documented in warning_ids.m
    • 44590 More documentation for the current status of classdef implementation

Classdef examples in the wild