Matlab类方法:参数太多

时间:2013-05-08 17:22:11

标签: matlab oop class methods arguments

我发现了一些相关问题,但在那里找不到答案。

我正在编写一个简单的小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.

我错过了什么?

3 个答案:

答案 0 :(得分:23)

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

我查看了我的代码并在适当的位置添加了obj,但未在MATLAB命令窗口中使用clear命令。由于我是MATLAB的新手,我不知道它的重要性。我只是假设保存文件并重新实例化我的类就足够了。事实并非如此。

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

答案 1 :(得分:1)

如果将方法声明为static:

,则无需将obj传递给输入
classdef class1
    methods (Static)
        function y=aPLUSb(a,b)
            y=a+b;
        end
    end
end

答案 2 :(得分: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

请注意,在您的问题中执行代码允许我访问并执行您的类中声明的所有方法。尝试访问第一个代码块中声明的方法会导致“参数太多”错误。尝试访问第二个块中声明的方法可以正常工作。