WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Propertie in Klasse wird nicht zugewiesen

 

flashpixx
Forum-Guru

Forum-Guru


Beiträge: 355
Anmeldedatum: 19.04.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.10.2008, 12:44     Titel: Propertie in Klasse wird nicht zugewiesen
  Antworten mit Zitat      
Hallo,

ich habe in meiner Klasse folgendes Problem (Matlab 7.4), dass ich ein Property nicht zuweisen kann.

Die Properties sind so deklariert:
properties(GetAccess='private', SetAccess='private')
joMeasurement = [];
gnDatasetLength = 0;
gnDatasetPosition = 0;
end

Wenn ich nun diese Methoden habe:

function abc(this, data)
this.gnDatasetLength = data;
end

und dann eine Methode
function r = xyz(this)
r = this.gnDatasetLength;
end

und diese nun so aufrufe
myo = myObj();
myo.abc(123)
myo.xyz()

ist die Ausgabe immer 0. Eine Änderung des Wertes ist im Konstruktor möglich. Interessant ist auch dass, das Javaobjekt was in joMeasurement lesen und verändern lässt, wenn ich es über Getter / Setter lese / ändere.
Auffällig ist dann noch, wenn ich das Semikolon in beiden Methoden entferne, dass bei der Setter der richtige Wert in der Ausgabe erscheint, aber nicht in der Variablen.

Weiterhin ist mir noch auf, dass das bei allen Properties so ist, die ich zusätzlich deklariere. Im Grunde ist es so, als wären alle Werte Const bzw können nur im Konstruktor geändert werden

Ich hoffe jemand kann mir bitte helfen
Danke

Phil
Private Nachricht senden Benutzer-Profile anzeigen


joekey
Forum-Century

Forum-Century


Beiträge: 169
Anmeldedatum: 03.04.08
Wohnort: Wien
Version: 2011b
     Beitrag Verfasst am: 20.10.2008, 21:59     Titel:
  Antworten mit Zitat      
Hallo Phill,

bin mir nicht sicher ob ich genau verstehe was du meinst, versuche es aber trotzdem erklären:

PROBLEM: du kannst die private Properties nicht setzen.

ERKLÄRUNG: das Verhalten der Properties ist korrekt. Du hast sie auf PRIVATE gesetzt. Somit sind sie ausschießlich von der Klasse selbst erreichber. Stelle dir mal vor du hast eine Klasse Haus. Deine privaten Properties sind Hauseinrichtung und Haussafe. Da es sich um PRIVATE properties handelt (sie sind im Haus abgeschlossen) kann man von außen (wenn du vor dem Haus stehst) auf sie nicht zugreifen. Diese Properties sind erreichbar ausschließlich von inneren des Hauses (quasi wenn du ein Schlüssel hast bist du berechtigt, das Haus zu betreten und das Einrichtung und Safe zu nutzen).

LÖSUNG: du hast zwei Möglichkeiten: entweder deklarierst du die Properties als PUBLIC, falls du von außen zugreifen willst. Oder sie bleiben PRIVATE und du kannst sie nur innerhalb der Klasse benutzen.

BEISPIEL:
Code:
classdef deineKlasse < hgsetget
    % deineKlasse ist von hgsetget abgeleitet

    properties (SetAccess=private, GetAccess=private)
        joMeasurement
        gnDatasetLength
        gnDatasetPosition
    end
    methods
        % Konstruktor + initialisierung der Variablen
        function obj=deineKlasse()
            obj.joMeasurement = [];
            obj.gnDatasetLength = 0;
            obj.gnDatasetPosition = 0;
        end
        % setter methode
        function set.gnDatasetLength(obj, length)
            obj.gnDatasetLength = length;
        end
        % getter methode
        function r = get.gnDatasetLength(obj)
            r = obj.gnDatasetLength;
        end
        % test methode setzt 99 in gnDatasetLength
        function test(obj)
           obj.set('gnDatasetLength',99)
        end
        % dispObj methode - zeigt die Variablen
        function dispObj(obj)
            fprintf('joMeasurement %2.0f\n', obj.get('joMeasurement'));
            fprintf('gnDatasetLength %2.0f\n', obj.get('gnDatasetLength'));
            fprintf('gnDatasetPosition %2.0f\n', obj.get('gnDatasetPosition'));
        end
    end
end
 

Wie du in meinem Code siehst, alle Operationen passieren innerhalb der Klasse: setzen und auslesen des Wertes einer Varialer.
TEST:
Code:
a = deineKlasse()
a.dispObj

joMeasurement
gnDatasetLength 0
gnDatasetPosition 0
Code:
a.test
a.dispObj

joMeasurement
gnDatasetLength 99
gnDatasetPosition 0

Vesuchst du außerhalb der Klasse Variable zu setzen, bekommst du folgende Fehlermeldung:
Code:
a.set('gnDatasetLength',99)

??? Error using ==> set
Setting the 'gnDatasetLength' property of the 'deineKlasse' class is not allowed.

Hoffentlich konnte ich dir ein bißchen helfen.

LG Joe
Private Nachricht senden Benutzer-Profile anzeigen
 
flashpixx
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 355
Anmeldedatum: 19.04.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.10.2008, 23:10     Titel:
  Antworten mit Zitat      
Ich kenne mich durchaus in der OOP Programmierung aus und kenne deshalb die Unterschiede zwischen public, (protected) und private.

Es geht hier um folgendes Problem

Code:

classdef myClass

properties (Get/Set private)
   gnDatalength = 0;
end

methods (Access=private)
     function readdata(this)
              daten lesen, aufbereiten
              this.gnDatalength=length(daten);
     end

     function workingdata(this)
           if this.gnDatalength > 0
                arbeite
           else
              error('fehler')
          end
     end
end
 


einmal die Zuweisung "this.gnDatalength=length(daten)" und einmal das Bool bei If "this.gnDatalength > 0" funktionieren nicht. length liefert den korrekten Wert, er wird aber aus irgendwelchen Gründen nicht in gnDatalength gesetzt, gnDatalength bei der If Abfrage hat immer den Wert, der unter properties gesetzt wird bzw. auch mal testweise im Konstruktor.

Jeder Zugriff innerhalb irgendeiner Methode auf die ein weiteres privates Property schlägt in dem Sinne fehl, dass das Property immer den Wert zur Initialisierung der Klasse hat, selbst wenn es innerhalb der Klasse geändert wird. Selbst wenn das Property "public" ist ändert sich nichts an diesem Verhalten, es sieht so aus als wäre es "const" (readonly) deklariert

Danke

Phil
Private Nachricht senden Benutzer-Profile anzeigen
 
joekey
Forum-Century

Forum-Century


Beiträge: 169
Anmeldedatum: 03.04.08
Wohnort: Wien
Version: 2011b
     Beitrag Verfasst am: 21.10.2008, 20:52     Titel:
  Antworten mit Zitat      
Hallo Phil,

ich kann das verhalten bei mir leider nicht bestätigen. Ich benutze aber 2008a. So weit ich weiß sind in 2007 nicht alle OOP Funktionalitäten implementiert (z.B. die statische Methoden). Ich habe folgendes Beispiel auf verschiedene Weisen getestet.

Code:

classdef myClass < handle
    properties (GetAccess=private, SetAccess=private)
        gnDatalength=0;
        data=[1 2 3 4 5];
    end
    methods
        function this=myClass(data)
            this.setData(data);
        end
        function test(this)
           this.readdata;
           this.workingdata;
        end
    end
    methods (Access=private)
        function setData(this, data)
           this.data=data;
        end
        function readdata(this)
            %daten lesen, aufbereiten
            this.gnDatalength=length(this.data);
        end
        function workingdata(this)
            if this.gnDatalength > 0
                fprintf('Bearbeite Daten... (Datenlänge: %2.0f)\n',this.gnDatalength)
            else
                fprintf('Keine Daten... (Datenlänge: %2.0f)\n',this.gnDatalength)
                error('fehler')
            end
        end
    end
end
 


Vielleicht meldet sich jemand der noch 2007 benutzt und OO programmiert.

LG Joe
Private Nachricht senden Benutzer-Profile anzeigen
 
Titus
Forum-Meister

Forum-Meister


Beiträge: 871
Anmeldedatum: 19.07.07
Wohnort: Aachen
Version: ---
     Beitrag Verfasst am: 29.10.2008, 12:12     Titel:
  Antworten mit Zitat      
Hallo,

der grundlegende Unterschied zwischen Eurer beiden Klassen ist, dass Phil eine "Value class" und Joe eine "Handle class" entworfen hat. Das Problem hat nichts mit Zugriffsrechten zu tun.
Bei einer Handle-Class werden Objekte nicht kopiert, sondern nur Referenzen kopiert. Daher funktioniert auch sowas wie
Code:
Obj.methodeDiePropertiesAendert();
% Obj wurde geaendert
 

Eine Value-Klasse funktioniert so nicht, sondern hier muss das geänderte Objekt (welches eine unabhängige Kopie ist!) wieder zugewiesen werden:
Code:

Obj = Obj.methodeDiePropertiesAendert();
 


Ciao,
Titus
Private Nachricht senden Benutzer-Profile anzeigen
 
flashpixx
Themenstarter

Forum-Guru

Forum-Guru


Beiträge: 355
Anmeldedatum: 19.04.08
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.11.2008, 12:13     Titel:
  Antworten mit Zitat      
Danke für die Erklärung, hat geholfen

Phil
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2024 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.