调用类方法 - 输入参数过多

Posted

技术标签:

【中文标题】调用类方法 - 输入参数过多【英文标题】:calling a class method - too many input arguments 【发布时间】:2014-12-05 09:05:15 【问题描述】:

我创建了一个简单的类来尝试了解更多关于 MATLAB 中的类

下面是我的课。

classdef ClassTest < handle

methods             
   function t1 = testone(numOne, numTwo)
      t1 = t2(numOne, numTwo); 
   end

   function t2 = testtwo(numOne, numTwo)
       t2 = numOne / numTwo;
   end
end

end

所以我使用下面的代码行创建了我的类的一个实例。

myClass = ClassTest;

然后我用下面的行调用函数 testone。

v = myClass.testone(20,5);

但收到错误消息“使用 ClassTest/testone 输入参数过多时出错。”这个没看懂?

我尝试将 5 排除在外,它实际上到达了 t1 = t2(numOne, numTwo) 行,但随后没有识别出令我感到惊讶的函数 t2?不关注这里发生的事情?

更新

如果我将方法设为静态,我将不再收到有关存在许多输入参数的错误消息,但是当从函数 testone 调用时它无法识别 testtwo 函数,除非我放置 ClassTest.testtwo。我还是觉得很奇怪

解决方案

玩了这么多,我现在可以运行代码,但不确定我是否完全理解正在发生的事情。

这两个函数应该如下所示,

   function t1 = testone(obj, numOne, numTwo)
      t1 = obj.testtwo(numOne, numTwo);           
   end

   function t2 = testtwo(obj, numOne, numTwo)
       t2 = numOne / numTwo;
   end

【问题讨论】:

【参考方案1】:

如果您希望方法是类的静态方法,则在方法块中定义它们,如下所示:

methods (Static)

然后您需要使用类名t1 = ClassTest.testone(20,5)t2 = ClassTest.testtwo(20,5) 来调用它们。

如果您希望它们成为类的方法,那么您通常会使用以下签名来定义它们:

function t1 = testone(obj, numOne, numTwo)

然后您可以使用myClass = ClassTest 创建该类的实例并调用t1 = myClass.testone(20,5)

myClass 对象作为它的第一个参数传递给方法(我总是使用名称 obj 作为第一个参数,但其他人使用诸如 this 之类的东西,类似于 Java 约定),并且是然后在整个方法代码中可用。

【讨论】:

【参考方案2】:

这可能与 matlab 加载类的方式有关。如果您已经在内存中有 myClass,然后您创建/修改函数定义,您可能会收到错误。

这里有更多关于 matlab 如何处理更新类的细节:http://www.mathworks.com/help/matlab/matlab_oop/modifying-and-reloading-classes.html

尝试从内存中清除所有变量(并作为最后的手段重新启动 matlab),然后重试。

【讨论】:

嗨,为了安全起见,我重新启动了我的 matlab,但仍然收到相同的错误消息

以上是关于调用类方法 - 输入参数过多的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C# 中的反射调用将输入参数作为另一个类对象的方法?(方法给出参数异常)

关于java编程的问题:一个类调用另一个类中构造方法中所定义的参数。

C#怎么调用方法

一文详解python的类方法,普通方法和静态方法

Python中的类方法实例方法静态方法

将类作为参数传递给方法,然后调用静态方法