我有一个问题来定义回调参数以及matlab documentation所说的对我没有帮助。
我的第一堂课:
classdef first < handle
properties
State = false
end
events
Contact
end
methods
function OnStateChange(obj,newState)
if newState ~= obj.State
obj.State = newState;
notify(obj,'Contact');
end
end
function follower(obj)
while 1
data=inputSingleScan(sessions_daq.NI_USB_1);
if data>3
obj.OnStateChange(true)
else
obj.OnStateChange(false)
end
end
end
end
end
我的第二堂课:
classdef second < handle
methods
function obj = answerer(obj_first,obj_third)
addlistener(obj_first,'Contact',@obj.handleEvnt);
end
function handleEvnt(obj,obj_first,~,obj_third,~)
if obj_first.State
obj_third.tracker()
end
end
end
end
我的第三堂课:
classdef third < handle
methods
function tracker(obj)
%computations
end
end
end
这是我得到的错误:
>> o_first=first;
o_third=third;
o_second=second(o_first,o_third);
>> o_first.follower
Warning: Error occurred while executing callback:
Undefined variable obj_third.
Error in second/handleEvnt (line 9)
obj_third.tracker()
Error in second>@(varargin)obj.handleEvnt(varargin{:}) (line 4)
addlistener(obj_first,'Contact',@obj.handleEvnt);
Error in first/OnStateChange (line 12)
notify(obj,'Contact');
Error in first/follower (line 19)
obj.OnStateChange(true)
> In first>first.OnStateChange at 12
In first>first.follower at 19
你能帮我吗?
非常感谢
答案 0 :(得分:0)
问题在于您将anonymous function定义为回调addlistener
的方式。触发事件时addlistener
will provide your function with two inputs。这些输入是:
event.EventData
对象,其中包含有关事件本身的信息。因此,当您指定回调时,必须适当地处理这两个输入。在您的情况下,您正在调用类的方法,因此,实际上将三个输入传递给您的回调。第一个输入是类的实例,另外两个是addlistener
提供的输入。
所以实际上,你所定义的回调就是这个
@(src, evnt)obj.handleEvnt(src, evnt)
因此,如果您查看方法second.handleEvnt
的函数定义,您将看到已编写它以期待五个输入。
function handleEvnt(obj,obj_first,~,obj_third,~)
您收到错误的直接原因是因为obj_third
并且最后一个输入是而不是通过您提供的回调传递给此函数(因为我们只说它传递三个输入。)
要解决此问题,您可以重新编写handleEvnt
方法,只接受三个输入。
function handleEvnt(obj, src, evnt)
或者您可以重写您的匿名函数以将其他函数传递给回调。
@(src,evnt)obj.handleEvnt(src, evnt, other, arguments)
除了使用匿名函数提供的方法之外,您还可以使用任何 MATLAB允许定义callback functions的方式。