2013-05-08 115 views
7

我发现了一些相关的问题,但并没有在那里找到答案。Matlab类方法:参数太多

我正在写一个简单的小MATLAB类,以便在MATLAB中学习OOP语法。我对Python非常熟悉,并且试图与MATLAB合作。这里的定义是:

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 

这肯定是不这样做,但后来我用一个脚本来惹对象:

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

实例化的工作,但我所说的任何方法抛出一个错误。 foo.start,例如:

Error using Car/start 
Too many input arguments. 

我在想什么?

+0

我要澄清,这始终是任何方法同“太多的输入参数”的错误我尝试调用一个对象。 – mrKelley 2013-05-08 17:26:02

+0

什么版本的MATLAB?您的代码适用于R2011b。 – Praetorian 2013-05-08 17:28:01

+0

有趣的是,R2013a – mrKelley 2013-05-08 17:33:46

回答

22

因为我不知道如何删除这个问题,我会尽我所能来回答它。像其他语言一样,MATLAB中面向对象编程希望将obj作为类方法中的第一个参数(例如python中的self)。该对象的引用对于修改其属性是必要的。我没有在方法定义中包含这个,所以当我调用方法时,我得到了“太多的参数”错误。这是因为如果你做foo.method(a,b),那么foo这个对象实际上是作为参数传递的,所以你的函数实际上得到3个输入,即method(foo,a,b)

我检查了我的代码并在适当的地方添加了0​​,但在MATLAB命令窗口中未能使用命令clear。由于我是MATLAB新手,我并不知道它的重要性。我只是假定保存文件并重新实例化我的类就足够了。不是这样。

我希望这可以帮助任何遇到此问题的人。

+5

+1因为其他人的利益而发布+1 – hAcKnRoCk 2013-07-25 17:07:17

0

你回答了你自己的问题,这很好。但是,您的问题看起来似乎包含您在开始时努力执行的代码。我本来以为你在一开始的代码看起来像:

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 

和,只是到了后来,成为了你在你的问题中写道:

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 

注意,在你的问题中执行的代码可以让我访问并执行在您的类中声明的所有方法。试图访问在第一个代码块中声明的方法会导致“太多的参数”错误。尝试访问第二个块中声明的方法与预期的一样。

1

你不需要给OBJ传递给输入如果你声明的方法为静态:

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