Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Class 如何访问/读取octave中的类实例属性?_Class_Oop_Properties_Octave_Getter Setter - Fatal编程技术网

Class 如何访问/读取octave中的类实例属性?

Class 如何访问/读取octave中的类实例属性?,class,oop,properties,octave,getter-setter,Class,Oop,Properties,Octave,Getter Setter,使一个类与我在类实例中附加的参数中的类相似,如下所示 function t = train (m, F_z, F_b, varargin) ... t.m = m; % total mass of train [kg] t.F_z = F_z; % ... ... t = class (t, "train"); 获取字段名是有效的 >> t1 = train(100, 150000, 200000); ... >> fie

使一个类与我在类实例中附加的参数中的类相似,如下所示

function t = train (m, F_z, F_b, varargin)
  ...
  t.m =     m;      % total mass of train [kg]
  t.F_z =  F_z;     % ...
  ...
  t = class (t, "train");
获取字段名是有效的

>> t1 = train(100, 150000, 200000);
...
>> fieldnames(t1)
ans =
{
  [1,1] = m
  [2,1] = F_z
  ...
但我如何访问这些?显然不是

>> t1.m
error: invalid index for class
>> getfield(t1, 'm')
error: invalid index for class
error: called from
...

如果我省略了行
t=class(t,'train')@train/train.m
中的
函数t=train(m..
的末尾,这些东西似乎都很好地工作……但是它是一个
结构,而不是一个

你可以用两种方法来实现。你可以定义一个方法来检索它(简单),或者你可以设置
subsref
(下标参考)(困难)

要定义一种方法,只需使用以下内容创建
@train/m.m

function r = m ()
  r = t.m;
endfunction
function r = subsref (val, idx)
  if (strcmp (idx.type, ".") && strcmp (idx.subs, "m"))
    r = val.m;
  endif
endfunction
要设置订阅,请使用以下命令创建
@train/subsref.m

function r = m ()
  r = t.m;
endfunction
function r = subsref (val, idx)
  if (strcmp (idx.type, ".") && strcmp (idx.subs, "m"))
    r = val.m;
  endif
endfunction
这将允许您仅访问字段
m
。要访问类中的任何属性,您只需执行以下操作:

function r = subsref (val, idx)
  r = subsref (struct (val), idx);
endfunction
要允许访问属性子集,您可以:

function r = subsref (val, idx)
  if (strcmp (idx.type, ".") && any (strcmp (idx.subs, {"m", "f2", "F_z"})))
    r = val.(idx.subs{1});
  endif
endfunction
但是
subsref
控制所有的索引,不仅仅是在作为结构访问对象时。您可以允许人们对对象进行索引(可能您有一个货车类,火车会返回它们)。该函数在开始时看起来有点奇怪(就像
subsasgn
(下标分配)),但可能非常有用。您可以执行以下操作:

function r = subsref (val, idx)
  if (strcmp (idx.type, ".") && strcmp (idx.subs, "m"))
    r = val.m;
  elseif (strcmp (idx.type, "()"))
    r = val.wagons(idx.subs{:});
  endif
endfunction

一种快速而肮脏的方法是在八度音阶中打破OOP原理。无需定义
subsref
getter
方法。要访问字段,只需将对象转换为
结构即可

>> t1 = train(100, 150000, 200000);
>> t1_easy = struct(t1);
>> t1_easy.m
>> t1_easy.F_z

如果要使用“.”访问它们,必须定义它: