2013-05-08 17 views
7

Znalazłem kilka powiązanych pytań, ale tak naprawdę nie znalazłem tam odpowiedzi.Metoda klasy Matlab: Zbyt wiele argumentów

Piszę prostą małą klasę MATLAB, aby poznać składnię OOP w MATLAB. Bardzo dobrze znam Pythona i wyciągam włosy, próbując pracować z MATLAB. Oto definicja:

classdef Car < handle 


    properties 
     speed = [0,0] %x,y velocity 
     position = [0,0] 
     running = false 

    end 

    methods 
     function obj = Car(pos, spd) 
      obj.position = pos; 
      obj.speed = spd; 
     end 

     function accelerate(obj,x,y) % Add to speed 
      obj.speed = obj.speed + [x,y] 
     end 

     function position = getPosition(obj) 
      position = obj.position 
     end 

     function start(obj) 
      obj.running = true 
     end 

     function stop(obj) 
      obj.running = false 
     end 
    end 

end 

To z pewnością nie jest zrobione, ale używam trochę skrypt bałagan z przedmiotu:

foo = Car([1,1],[0,2]) 
foo.start 
foo.accelerate(2,3) 

Tworzenie instancji działa, ale każda metoda Wzywam zgłasza błąd . foo.start, na przykład:

Error using Car/start 
Too many input arguments. 

Czego mi brakuje?

+0

powinienem wyjaśnić, że to jest zawsze to samo „zbyt wiele argumentów wejściowych” błąd dla każdej metody I spróbuj wywołać obiekt. – mrKelley

+0

Jaką wersję MATLAB? Twój kod działa dla mnie na R2011b. – Praetorian

+0

Interesujące, R2013a – mrKelley

Odpowiedz

22

Ponieważ nie mogę wymyślić, jak usunąć to pytanie, zrobię co w mojej mocy, aby na nie odpowiedzieć. Podobnie jak inne języki, programowanie zorientowane obiektowo w MATLABie chce zobaczyć obj jako pierwszy parametr w metodach klasowych (np. self w pythonie). To odniesienie do obiektu jest konieczne, aby zmodyfikować jego atrybuty. Nie uwzględniłem tego w definicjach metod, więc gdy nazwałem metodę, otrzymałem błąd "zbyt wiele argumentów". Dzieje się tak, ponieważ jeśli robisz foo.method(a,b), obiekt foo jest faktycznie przekazywany jako parametr, więc funkcja faktycznie otrzymuje 3 wejścia, tj. method(foo,a,b).

Przeszedłem przez mój kod i dodałem obj w odpowiednich miejscach, ale NIE POWIODŁO SIĘ, ABY KORZYSTAĆ Z KOMPUTERA clear w oknie poleceń MATLAB. Ponieważ jestem nowy w firmie MATLAB, nie zdawałem sobie sprawy z jego znaczenia. Właśnie założyłem zapisanie pliku i powtórzenie mojej klasy byłoby wystarczające. Nie jest.

Mam nadzieję, że pomoże to każdemu, kto napotka na to pytanie.

+5

+1 za opublikowanie na rzecz innych osób – hAcKnRoCk

0

Odpowiedziałeś na własne pytanie, które jest wspaniałe. Wydaje się jednak, że twoje pytanie zawiera sam kod, na którym walczyłeś, aby zostać wykonanym na początku. Myślałem, że kod na początku wyglądało:

classdef Car < handle 


    properties 
     speed = [0,0] %x,y velocity 
     position = [0,0] 
     running = false 

    end 

    methods 
     function obj = Car(pos, spd) 
      obj.position = pos; 
      obj.speed = spd; 
     end 

     function accelerate(x,y) % Add to speed 
      obj.speed = obj.speed + [x,y] 
     end 

     function position = getPosition() 
      position = obj.position 
     end 

     function start() 
      obj.running = true 
     end 

     function stop() 
      obj.running = false 
     end 
    end 

end 

, a dopiero później stał się co napisałeś w swoim pytaniu:

classdef Car < handle 


    properties 
     speed = [0,0] %x,y velocity 
     position = [0,0] 
     running = false 

    end 

    methods 
     function obj = Car(obj,pos, spd) 
      obj.position = pos; 
      obj.speed = spd; 
     end 

     function accelerate(obj,x,y) % Add to speed 
      obj.speed = obj.speed + [x,y] 
     end 

     function position = getPosition(obj) 
      position = obj.position 
     end 

     function start(obj) 
      obj.running = true 
     end 

     function stop(obj) 
      obj.running = false 
     end 
    end 

end 

Należy pamiętać, że wykonywanie kodu w swoim pytaniu pozwala mi uzyskać dostęp i wykonać wszystkie metody zadeklarowane w twojej klasie. Próba dostępu do metod zadeklarowanych w pierwszym bloku kodu spowodowałaby błąd "zbyt wiele argumentów". Próba dostępu do metod zadeklarowanych w drugim bloku działa zgodnie z oczekiwaniami.

1

Nie trzeba zdać OBJ do wejścia jeśli zadeklarować metody jako statyczne:

classdef class1 
    methods (Static) 
     function y=aPLUSb(a,b) 
      y=a+b; 
     end 
    end 
end 
Powiązane problemy