2015-04-09 2 views
0

Эй, я сейчас изучаю классы.Классы Matlab, путаница

Я не думаю, что мое понимание классов - это 100%, чтобы быть честным, но я не могу хорошо понять это из заметок лекций. Если бы кто-нибудь мог дать мне какие-то намеки относительно того, что я делаю неправильно, это было бы хорошо оценено.

мне нужно, чтобы получить некоторые, что с входом:

man = Dumbo('Fred', 10); 
fprintf('%s is %d years old.\n', man.name, man.age); 
olderMan = man.olderBy(5); % Get a new older man 
fprintf('Older %s is %d years old.\n', ... 
    olderMan.name, olderMan.age); 

Чтобы получить выход:

Фред 10 лет. Старшему Фреду 15 лет.

До сих пор он у меня работает, чтобы произвести первую линию, но она не работает для второго, подходя с ошибкой, говоря:

Ошибка с помощью Дамбо/olderBy

Слишком много входные аргументы.

Вот мой код:

classdef Dumbo 
    %used to find details of a man and an older man 

    properties 
     name = 'noName' 
     age= 0 
    end 

    methods 

     function man=Dumbo(name,age) 
      man.name = name; 
      man.age = age; 
     end 

     function olderMan = olderBy(years) 
      olderMan.name = man.name 
      olderMan.age = man.age + years 
     end 

    end 
end 

Любые предложения в том, что я не прав, что я мог сделать вместо этого, и причины этого?

Спасибо!

ответ

2

Довольно простая ошибка. Вы забыли включить man или текущий объект, из которого был вызван метод, в качестве входного аргумента в olderBy. Кроме того, то, что вы на самом деле делаете в приведенном выше коде, заключается в том, что вы возвращаете struct (спасибо @SamRoberts!). Я предполагаю, что вы хотите вернуть другой экземпляр объекта с измененными полями, и поэтому вам следует создать другой отдельный экземпляр объекта. Как только вы это сделаете, измените этот экземпляр и верните его пользователю. Это можно сделать просто, выполнив olderMan = man; в начале вашей функции.

Поэтому:

function olderMan = olderBy(man,years) %// Change here 
    olderMan = man; %// Change 
    olderMan.name = man.name 
    olderMan.age = man.age + years 
end 

Когда вы имеете дело с методами MATLAB объектно-ориентированного программирования, первый параметр должен быть ссылкой на объект, что метод вызывается после. В вашем случае это выглядит как man. man содержит ссылку на объект, который называется olderBy, и это необходимо для всех методов, относящихся к Dumbo. Я также рекомендовал бы разместить полуколоны в конце каждого заявления в вашем классе. Таким образом, выход не вторит после каждого выступления .... так что:

function olderMan = olderBy(man,years) %// Change here 
    olderMan.name = man.name; 
    olderMan.age = man.age + years; 
end 

Запуск кода выше, я получаю:

Fred is 10 years old. 
Older Fred is 15 years old. 
+1

Тщательное @rayryeng. Несмотря на то, что ваш код работает, чтобы дать результат, который требуется в вопросе OP, 'oldMan' не (который, как мне кажется, можно ожидать) является объектом класса' Dumbo', это структура. Вы можете поместить строку 'oldMan = man;' перед изменением имени и возраста. –

+0

@SamRoberts очень и очень верно. Я не обратил на это внимания. Я изменю сообщение, когда смогу. Большое спасибо за определение! – rayryeng

Смежные вопросы