2017-12-07 3 views
0

Wenn ich eine Methode (Empfangen und Zurückgeben obj) aufrufen, ändert es meine Eigenschaft.Matlab, wie eine Klassenmethode aufgerufen wird, die Prop von einer anderen Klassenmethode ändert

Aber wenn ich diese Methode von einer anderen Methode aufrufen, schlägt es fehl. Ich habe alle möglichen Wege ausprobiert, aber immer noch versagt.

classdef AClass 
    properties 
    A; 
    end 
    methods 
    function obj = ChangeA(obj, v) 
     obj.A = v; 
    end 
    function obj = CallChangeA(obj) 
     obj.ChangeA(4); 
     %obj = obj.ChangeA(4); 
     %ChangeA(obj, 4); 
     %obj = ChangeA(obj, 4); 
     % none of these works 
    end 
    end 
end 

% ------ script: 
a1 = AClass; 
a1.A = 1; 
a1.ChangeA(2); % a1.A = 2 

a2 = AClass; 
a2.A = 3; 
a2.CallChangeA(); % a2.A = 3 !!! not four 

Wie schreibe ich den Code, also Aufruf von 1 Methode zu den anderen aktualisiert die Eigenschaft?

+0

Ihr Beispielcode funktioniert nicht. 'ChangeA' hat' a' als Eingabe, versucht aber 'obj.A' mit' mz' zu setzen, was nicht definiert ist. – excaza

Antwort

3

Anders als die offensichtlichen Tippfehler in Ihrem Beispielcode, würde ich sehr empfehlen, einen Blick auf die difference between MATLAB's Handle and Value classes zu werfen. Standardmäßig sind MATLAB-Klassen Wertklassen. Jedes Mal, wenn das Objekt an eine Funktion übergeben wird, wird eine unabhängige Kopie erstellt. Wenn Sie Änderungen an diesem Objekt zu machen, dann müssen Sie es als eine Ausgabe zurück:

classdef AClass 
    properties 
     A; 
    end 
    methods 
     function obj = ChangeA(obj, a) 
      obj.A = a; 
     end 

     function obj = CallChangeA(obj) 
      obj = obj.ChangeA(4); 
     end 
    end 
end 

Welche wie erwartet funktioniert:

>> a1 = AClass; 
>> a1.A = 1 

a1 = 

    AClass with properties: 

    A: 1 

>> a1 = a1.CallChangeA() 

a1 = 

    AClass with properties: 

    A: 4 

Handle-Klassen, auf der anderen Seite, sind Verweise auf eine einzelne Aufgabe zugrunde, so dass für (unter anderem) anstelle Modifikation des Objekts:

classdef AClass < handle 
    properties 
     A; 
    end 
    methods 
     function ChangeA(obj, a) 
      obj.A = a; 
     end 

     function CallChangeA(obj) 
      obj.ChangeA(4); 
     end 
    end 
end 

, die auch als erwartet:

>> a1 = AClass; 
>> a1.A = 1; 
>> a1.A 

ans = 

    1 

>> a1.CallChangeA() 
>> a1.A 

ans = 

    4 
+0

Also die erste bemerkte Option war korrekt, aber ich muss auch die Funktion in eine Kopie des Objekts aufrufen. 'a1 = a1.CallChangeA (4);' Andernfalls 'a1.CallChangeA (4);' erstellt eine Kopie der AClass und speichert die Ergebnisse nicht in a1. – pashute

+0

Ich verstehe nicht, was Sie fragen. Ich habe beide Optionen zur Verfügung gestellt: eine, die eine Kopie von 'a1' modifiziert und eine, die' a1' direkt modifiziert. – excaza

+0

Ich sage Danke !! und deine Antwort verstehen. Nicht weiter fragen. Nur von Ihrer sehr detaillierten vollständigen Antwort, was ich in meinem Code ändern muss, um es zum Laufen zu bringen. Der ursprüngliche Code hatte eine Zeile mit der Bemerkung, dass es nicht funktioniert. Es hätte funktioniert, wenn der Aufruf der Funktion an erster Stelle das Ergebnis in das Objekt kopiert hätte. Danke nochmal!!! – pashute

Verwandte Themen