7

我发现了一些相关的问题,但在那里并没有真正找到答案。

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

我错过了什么??

4

3 回答 3

24

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

我浏览了我的代码并obj在适当的位置添加,但未能clear在 MATLAB 命令窗口中使用该命令。由于我是 MATLAB 新手,所以我没有意识到它的重要性。我只是假设保存文件并重新实例化我的类就足够了。它不是。

我希望这对遇到这个问题的人有所帮助。

于 2013-05-08T17:48:59.797 回答
1

如果将方法声明为静态,则无需将 obj 传递给输入:

classdef class1
    methods (Static)
        function y=aPLUSb(a,b)
            y=a+b;
        end
    end
end
于 2015-08-02T17:19:11.127 回答
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

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

于 2015-02-24T23:17:27.867 回答