2014-08-27 2 views
1

У меня есть следующий пример кода.MATLAB: Недостаточно входных аргументов в конструкторе при создании массива объектов

classdef test < handle 
    properties 
    p1; 
    p2; 
    p3; 
    end 

    methods 
    function obj=test(p1, p2, p3) 
     obj.p1=p1; 
     obj.p2=p2; 
     if nargin<4 
     obj.p3=0; 
     else 
     obj.p3=p3; 
     end 
    end 
    end 
end 

Теперь, если я

m=test(1,1) 

я, как и ожидалось,

m = 

    test with properties: 

    p1: 1 
    p2: 1 
    p3: 0 

С другой стороны, если я

n=test.empty([0, 2, 2]); 
n(1,1)=test(1,1); 

Я получаю

Error using test (line 10) 
Not enough input arguments. 

То же самое происходит с n(1,1)=test(1,1,1).

Мне действительно интересно, что здесь происходит. Очевидно, что если я дам больше 3-х аргументов, то я получаю Too many input arguments.

EDIT

Я использую MATLAB R2013a.

ответ

0

Как правило, вы можете использовать средства отладки matlab для решения этой проблемы. Я скопировал ваш код и поставил точку останова в строке 10, чтобы увидеть, что происходит.

В вашем случае код, как написано строит весь массив объектов, когда вы выполняете эту строку

n(1,1) = test(1,1); 

Эта линия изменяет размер массива от 0 х 2 х 2 до 1 х 2 х 2, поэтому он пытается создать экземпляр всех 4 объектов и не имеет аргументов для инициализации последних трех объектов.

Чтобы решить эту проблему, я предлагаю создать новый метод, я назвал его .initialize.

classdef test< handle 
    properties 
     p1; 
     p2; 
     p3; 
    end 

    methods 
     function obj=test() 
     end 
     function initialize(obj,p1,p2,p3) 
      obj.p1=p1; 
      obj.p2=p2; 
      if nargin<4 
       obj.p3=0; 
      else 
       obj.p3=p3; 
      end 
     end 
    end 
end 

Затем вы можете создать массив, создать экземпляр объектов и затем инициализировать каждый объект.

n = test.empty([0 2 2]); 
n(1,1) = test; 
n(1,1).initialize(1,1); 
Смежные вопросы