我正在尝试在MATLAB 2014中创建一个简单的代理和环境类。
我正试图让对象' a' Agent类作为Environment类的属性之一。我已经在Environment类构造函数中初始化了该对象,但每当我尝试使用此对象A访问Agent类的方法时,我都会收到警告:
"令人困惑的函数调用。您的意思是引用属性' a'?"
这是我的Environment类和Agent类。如何直接从interact_with_agent_function
调用Agent类的方法,就像我们在JAVA中调用一样?
classdef Environment < handle
properties (Constant = true)
V = 0.5;
T = 1;
end
properties (SetObservable= true)
A;
B;
a;
end
methods
function obj = initialize(obj, A, B)
obj.A = A;
obj.B = B;
a = Agent();
end
function act = call_agent(obj)
act = agent_function(a, obj.A, obj.B, obj.V, obj.T);
end
function action = interact_with_agent(obj)
action = obj.call_agent();
end
end
end
classdef Agent < handle
properties (SetObservable = true)
action;
end
methods
function action = agent_function(obj, A, B, v, t)
obj.action = A + v * t * ((B - A) / norm(B - A));
action = obj.action;
end
end
end
答案 0 :(得分:0)
这里的问题如下:
在类定义中,您创建了Environment类的变量(property):lowercase a
在initialize
方法中,您创建了一个局部变量a
,该函数在函数完成后被删除。您应该使用obj.a = ...
将Agent()保存在对象中。
在call_agent
中,您使用未初始化的本地变量a
作为第一个输入。如果您的意思是引用您班级的a
财产;使用obj.a
代替
最重要的是,知道matlab有一个类的默认初始化函数可能是有用的,它与你的类的名称相匹配;在您的情况下,这将是function obj = Agent(obj)
和function obj = Environment(obj)
;另请参阅https://nl.mathworks.com/help/matlab/object-oriented-programming.html以获取有关matlab中类的更多信息。
答案 1 :(得分:0)
您应该这样定义您的课程:
classdef Environment < handle
properties (Constant = true)
V = 0.5;
T = 1;
end
properties (SetObservable= true)
A;
B;
a;
end
methods
% Replace here the init function using the Matlab Constructor
function obj = Environment(obj, A, B)
obj.A = A;
obj.B = B;
obj.a = Agent(); % Call the Agent constructor here
end
function act = call_agent(obj)
% Calling agent_function will automatically put a as the first argument
act = obj.a.agent_function(obj.A, obj.B, obj.V, obj.T);
end
function action = interact_with_agent(obj)
action = obj.call_agent();
end
end
end
classdef Agent < handle
properties (SetObservable = true)
action;
end
methods
% Create Constructor
function obj = Agent()
obj.action = [];
end
function action = agent_function(obj, A, B, v, t)
obj.action = A + v * t * ((B - A) / norm(B - A));
action = obj.action;
end
end
end
我不知道你为什么使用两个函数来使用属性a
。
可以直接在函数agent_function
中调用函数interact_with_agent
。
无论如何,如果你真的想用这种方式编码,你应该使用call_agent
将函数methods (Static, Access = private)
设置为静态。像这样,访问属性a
的唯一方法是使用函数interact_with_agent