Getter und Setter Anwendung
-
Hallo alle zusammen,
Ich benutze eine getter und setter Methode in eine Klass A, dann rufe ich die getter methode ausserhalb der Klass A.Wie soll ich das benutzen?
So sieht meine Anwendung aus:class A { public: ... double getPeriodeA() { return m_periodeA} void setPeriodeA(double dPeriodeA){ m_periodeA = dPeriodeA; } double getPeriodeB() { return m_periodeB} void setPeriodeB(double dPeriodeB){ m_periodeB = dPeriodeB; } private: .... double m_periodeA, m_periodeB; }; Class B { ..... void auswertung() { ...... A a; if(a.getPeriodeA() > 5000) // der Object in getPeriodeA() ist immer 0 ? { } } };
Ich weiss, dass es eine blöde Frage und dafür entschuldige ich mich.
die getPeriodeA() ist schon initialisiert bzw. setPeriodeA() ist schon gesetzt in Klasse A.Danke in voraus und sorry nochmal
-
Wo soll denn ein anderer Wert für m_periodeA herkommen? Du erzeugst eine Instanz von A und anschließend fragst du den Wert von m_periodeA ab.
Zeig doch mal den Konstruktor.
-
Entschuldige Dich nicht für eine blöde Frage. Die Frage wird dadurch nicht besser oder schlechter.
Reduziere das Beispiel soweit wie möglich. Du kannst die Klasse auf
m_periodeA
undm_periodeB
mit den Gettern und Settern und dem Konstruktor reduzieren. Stattauswertung()
machst Du eine main-Funktion. Damit wird das zu einem vollständig compilierbaren und ausführbaren Beispiel. Das probierst Du dann nochmal aus. Wenn es nicht funktioniert wie erwartet, dann Zeigst Du uns dieses minimale Beispiel. Schreibe, was Du erwartest und was Du beobachtest. Dann können wir das Beispiel nachvollziehen und bei Bedarf sogar selbst ausprobieren.Eventuell hilft Die das weiter. Dann bekomsst Du hier ganz viel Hilfe und brauchst Dich nicht mehr zu entschuldigen und wir sind alle glücklich
.
-
Vor allem auch immer den echten Code posten, nicht etwas was du für's Forum schnell zusammengeschrieben hast.
Dein Code hier compiliert nichtmal, weil in den Gettern die ";" fehlen.Weiters schreibst du "die getPeriodeA() ist schon initialisiert bzw. setPeriodeA() ist schon gesetzt in Klasse A" - wäre aber doch viel einfacher wenn du statt dessen den Code dafür herzeigst.
Und ich verstehe auch ehrlich gesagt nicht ganz was du jetzt eigentlich wissen willst.
-
Hier ist einen dummy Beispiel:
/class A class A { public: A(); ~A(); void getPeriodeA(){ return m_periodeA} void setPeriodeA(double Periode){ m_periodeA = Periode = 34.6 ;} private: double m_periodeA; }; //cpp #include "A.h" A::A(void) { } A::~A(void) { }
class B
#pragma once #include "A.h" class B { public: B(); ~B(); void auswertung(); }; //cpp #include "B.h" #include<iostream> using namespace std; B::B(void) { } B::~B(void) { } void B::auswertung() { A a; if(a.GetRelativeSDDevPeriode()>0) { cout << "blabala " << endl; } // mir geht es darum: wie ich die WertValue der getPeriodeA() zugreifen kann }
main methode:
#include "stdafx.h" #include "B.h" int _tmain(int argc, _TCHAR* argv[]) { B b; b.auswertung(); getchar(); return 0; }
-
void getPeriodeA(){ return m_periodeA}
double getPeriodeA(){ return m_periodeA;}
und
void B::auswertung() { A a; if(a.GetRelativeSDDevPeriode()>0) { cout << "blabala " << endl; } // mir geht es darum: wie ich die WertValue der getPeriodeA() zugreifen kann double WertValue = getPeriodeA(); }
-
Du hast möglicherweise 'husbaer' nicht richtig verstanden, der Code läuft ja so auch nicht!
Aber trotzdem ein Versuch; der Wert 'm_periodeA' in Objekt 'a' (Klasse A) wird ausschließlich in Methode A::setPeriodeA(double Periode) gesetzt (auf 34.6).
Wo wird diese Methode aufgerufen?
Außerdem ist die Methode "GetRelativeSDDevPeriode()" in A nicht vorhanden.
-
//a.h class A { public: // A(); brauchst du nicht // ~A(); brauchst du nicht double getPeriodeA(){ return m_periodeA;} //semikolon fehlte, rückgabewert double // void setPeriodeA(double Periode){ m_periodeA = Periode = 34.6 ;} //das macht keinen sinn. //entweder: void setPeriodeA() {m_periodeA = 34.6;} //oder void setPeriodeA(double Periode = 34.6) { m_periodeA = Periode; } //vermutlich aber: void setPeriodeA(double Periode) { m_periodeA = Periode; } private: double m_periodeA; };
//a.cpp #include "A.h" /* brauchst du nicht A::A(void) {} A::~A(void) {} */
-> brauchst du gar nicht.
---
//b.h #pragma once //#include "A.h" - brauchst du hier (noch) nicht class B { public: // B(); - brauchst du nicht // ~B(); - brauchst du nicht void auswertung(); };
//b.cpp #include "b.h" #include "a.h" //hier musst du es dann includieren #include<iostream> using namespace std; /* brauchst du nicht B::B(void) {} B::~B(void) {} */ void B::auswertung() { A a; //SO> a.setPeriodeA(34.6); //<SO // if(a.GetRelativeSDDevPeriode()>0) if(a.gerPeriodeA() > 0.) { cout << "blabala " << endl; } // mir geht es darum: wie ich die WertValue der getPeriodeA() zugreifen kann }
//main.cpp #include "b.h" int main() { B b; b.auswertung(); getchar(); }
bei der nächsten frage, achte bitte darauf, dass wenigstens die code-schnipsel zusammen passen...
bb
-
void B::auswertung() { A a; //SO> a.setPeriodeA(34.6); //<SO // if(a.GetRelativeSDDevPeriode()>0) if(a.getPeriodeA() > 0.) { cout << "blabala " << endl; } // mir geht es darum: wie ich die WertValue der getPeriodeA() zugreifen kann }
//SO>
a.setPeriodeA(34.6);
//<SO
Diesem wert habe ich aber nicht bei class B und genau diesem Value wollte ich von dergetPeriodeA()
in class A holen.
Ist das möglich?
-
Nochmal: mach ein vollständiges compilierbares Beispiel. Möglichst mit korrekter Einrückung. Deine Codeschnipsel enthalten Syntaxfehler. Die zeigt Dir Dein Compiler bereits an. Wenn Du die korrigierst hast, dann zeige und den Code. Achte darauf, dass der Code zumindest mal syntaktisch korrekt ist. Und rufe keine Methoden auf, die es nicht gibt. Und kommentiere diese Aufrufe nicht aus sondern lass sie einfach weg, wenn sie für die Problembeschreibung nicht relevant sind (
a.GetRelativeSDDevPeriode()
).Ich wundere mich wieder über die Bereitschaft Dir zu helfen, obwohl Du die Frage noch nicht mal korrekt stellst.
P.S: ach ja - und korrekte Einrückung erhöht die Lesbarkeit und hilft uns bei der Fehlersuche.
-
So hier noch mal:
class A:#pragma once class A { public: A(); ~A(); double getAperideA() { return m_Aperiode ; }; void setAperiodeA(double a) { m_Aperiode = 9; } double m_Aperiode; };
Class B :
#pragma once class B { public: B(); ~B(); void auswertung(); };
cpp File von class B
#include "stdafx.h" #include "B.h" #include "A.h" #include<iostream> using namespace std; B::B(){} B::~B(){} void B::auswertung() { A a; int i = 0; a.setAperiodeA(a.m_Aperiode); if (a.getAperideA() > 0) { cout << " blabla" << endl; } }
main methode
#include "stdafx.h" #include "B.h" int _tmain(int argc, _TCHAR* argv[]) { B b; b.auswertung(); getchar(); return 0; }
In diesem Beispiel geht es wie oben gesagt wurde und der Value von "m_Aperiode" in class A.
Es ist unschön wie ich jetzt gemacht habe, da fragt man sich wofür sind die denn Getter und Setter.
-
Na siehst Du. Und jetzt noch den Code korrekt kommentieren:
// zur Verwirrung der Russen lasse ich das 'o' in Aperiode mal weg. Ist ja sonst langweilig: double getAperideA() { return m_Aperiode ; }; // kümmere Dich nicht darum, was der Anwender übergibt sondern setze die Variable immer // auf den Wert 9! void setAperiodeA(double a) { m_Aperiode = 9; } };
:p
Ach ja - was war nochmal die Frage?
-
Ich mach mal weiter.
MarcelGast schrieb:
cpp File von class B
void B::auswertung() { A a; int i = 0; // setze periode auf wert der periode selber // macht ja nichts, weil der Setter das Argument eh ignoriert // ignoriere auch konsequent den Getter, sondern greife einfach so auf die public Variable zu a.setAperiodeA(a.m_Aperiode); if (a.getAperideA() > 0) { cout << " blabla" << endl; } }
-
Ist das Okay, wenn ich der Member Variable " m_Aperiode" als public deklariert habe?
-
MarcelGast schrieb:
Ist das Okay, wenn ich der Member Variable " m_Aperiode" als public deklariert habe?
Nein. Damit sind Getter und Setter überflüssig.
-
Wie kann ich dann besser machen?
-
Was ich erreichen möchte ist folgende:
Ich habe zwei klassen, die von einander nicht wissen.class A { public: .... // wie üblich halt double gePeriodeA(); void setPeriodeA(double periodeA); private: double m_PeriodeA; ..... }; #include "A.h" class B { //Wie üblich void machwas(); }; // cpp von B void B ::machwas() { // hier möchte ich das Value der Methode getPeriodeA() holen // dieses Value entspricht das Value was der Methode bei Klass A hat // zB. wenn die getPeriodeA() "in class A als Value von 100 liefern ", muss ich hier "in class B bei der Methode machwas() " auch das gleiche Wert liefern. // problem: ich weiss es nicht wie ich das machen sollte. }
Danke in voraus
-
MarcelGast schrieb:
class A { public: .... // wie üblich halt double gePeriodeA(); void setPeriodeA(double periodeA); private: double m_PeriodeA; ..... };
Naja, als üblich würde ich es nicht gerade bezeichnen, eine 1:1:1 Korrespondenz von Getter, Setter und Member zu haben.
// hier möchte ich das Value der Methode getPeriodeA() holen
// dieses Value entspricht das Value was der Methode bei Klass A hat
// zB. wenn die getPeriodeA() "in class A als Value von 100 liefern ", muss ich hier "in class B bei der Methode machwas() " auch das gleiche Wert liefern.
// problem: ich weiss es nicht wie ich das machen sollte.Das ist doch genau das, was passiert. Wo ist das Problem? Was sollte denn sonst passieren? Die Frage ist wohl eigentlich, von welchem A-Objekt du redest, denn ich sehe an der Stelle keines.
-
SeppJ schrieb:
Das ist doch genau das, was passiert. Wo ist das Problem?
Ich bekomme einen 0 , wenn ich die methode getPeriodeA() in class B aufrufe.
ist die void setPeriodeA(double periodeA) in A gesetzt bzw. ist der Member variable "m_PeriodeA" gesetzt ?
@ jaSeppJ schrieb:
Was sollte denn sonst passieren?
Der Member variable "m_PeriodeA" ist in A gesetzt
und genau diesem Wert von "m_PeriodeA" möchte ich in B holen.SeppJ schrieb:
Die Frage ist wohl eigentlich, von welchem A-Objekt du redest, denn ich sehe an der Stelle keines
A-Objekt ist doch die ganze Klasse A.
-
MarcelGast schrieb:
A-Objekt ist doch die ganze Klasse A.
Nein, ist es nicht. Und da liegt vermutlich das Problem. Eine Klasse ist eine Beschreibung. Eine Wörterbuchdefinition. Ein Objekt ist eine konkrete Umsetzung, eine Verwirklichung dieser Beschreibung. So wie sich der Lexikonartikel zu "Hund" zu den Objekten auf diesen Bildern verhält. Alle diese Objekte haben gemeinsame Eigenschaften (bei dir: Sie besitzen einen double namens m_PeriodeA und ein paar Funktionen, um auf diesen zuzugreifen), aber bloß weil ein bestimmter Hund braunes Fell hat, haben nicht alle anderen auch braunes Fell.
Du hantierst aufgrund dieses Missverständnisses anscheinend unwissentlich mit mehreren A-Objekten. Bei einem davon hast du den von dir gewünschten Wert gesetzt, aber dann befragst du ein anderes Objekt nach seinem Wert und wunderst dich zu unrecht, dass dieses einen anderen Wert liefert.