调用类方法 - 输入参数过多
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# 中的反射调用将输入参数作为另一个类对象的方法?(方法给出参数异常)