2017-01-14 2 views
0

Я пытаюсь сделать простой агент и класс среды в MATLAB 2014.Возможно ли иметь объект некоторого класса как свойство класса, как другой класс в MATLAB?

Я пытаюсь, чтобы объект «а» класса Агента был одним из свойств класса среды. Я инициализируюсь объект в конструкторе класса окружающей среды, но всякий раз, когда я пытаюсь доступ метода класса Agent с использованием данного объекта, я получаю предупреждение, как:.

«вызова Смешения функции вы имели в виду для ссылки свойство 'a'? "

Вот мой класс среды и класс агента. Как я могу вызвать метод класса Agent от interact_with_agent_function, как мы называем 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 
+2

Если вы хотите обратиться к свойству-члену, вы должны быть явным и использовать 'obj.a = Agent()' – Suever

ответ

0

Проблема здесь заключается в следующем:

  • в определении класса, вы создали переменную (свойство) вашего класса окружающей среды: строчную a

  • в методе initialize, вы создаете локальную переменную a, которая удаляется после завершения функции. Вы должны использовать obj.a = ... для сохранения агента() в объекте.

  • в 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.

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

Смежные вопросы