Einige Anfängerfragen zu Klassen
-
Likemike schrieb:
Ah, vielen Dank! So funktionierts... ich wusste nicht, dass ich die einzelnen Instanzen selbst reinpacken muss, aber eigentlich macht das auch Sinn!
Geld musst du auch selbst in deinen Geldbeutel tun, das fliegt auch net von selbst rein.

-
Ja, das stimmt wohl leider
.So, nächstes kleines Problem: jetzt möchte ich gerne eine Variable in der Instanz der Klasse verändern - und dafür verwende ich eine Funktion in der Klasse:
class A { public: string flag; int number; int apple; int banana; int gesamt; void Funktion(); {gesamt=apple + banana; } }; int main() { A One; One.flag="b"; One.number=4; One.apple=2; One.banana=3; One.gesamt=0; A Two; Two.flag="a"; Two.number=2; Two.apple=5; Two.banana=8; Two.gesamt=0; array<A,2> ar = {One,Two}; for(int i=0; i<ar.size(); ++i) { ar[i].Funktion(); } cout << One.gesamt << endl << Two.gesamtDie Funktion wird zwar korrekt ausgeführt, nur die Variable der einzelnen Instanzen wird nicht verändert - woran liegt das?
-
Likemike schrieb:
array<A,2> ar = {One,Two};Die Funktion wird zwar korrekt ausgeführt, nur die Variable der einzelnen Instanzen wird nicht verändert - woran liegt das?
=macht eine Kopie. SprichOneundTwowerden kopiert, sprichar[0]undar[1]haben nichts mehr mitOneundTwoam Hut. Sprich du musst dann schonar[0].gesamtausgeben.
-
Ah, ok, das wusste ich nicht. Ist es denn auch möglich die Variable in der Originalinstanz zu verändern - oder müsste ich dafür in der for-Schleife das jeweils anordnen, etwa so:
array<A,2> ar = {One,Two}; for(int i=0; i<ar.size(); ++i) { ar[i].Funktion(); One.gesamt=ar[0].gesamt; Two.gesamt=ar[1].gesamt; }
-
Likemike schrieb:
Ah, ok, das wusste ich nicht. Ist es denn auch möglich die Variable in der Originalinstanz zu verändern.
Ne. Container können keine Referenzen aufnehmen. D.h. du müsstest Zeiger auf One und Two speichern.
Likemike schrieb:
array<A,2> ar = {One,Two}; for(int i=0; i<ar.size(); ++i) { ar[i].Funktion(); One.gesamt=ar[0].gesamt; Two.gesamt=ar[1].gesamt; }So gehts natürlich auch, allerdings ändert das nichts daran, dass die Elemente des Arrays und die beiden Objekte unabhängig voneinander sind.
-
out schrieb:
Likemike schrieb:
Ah, ok, das wusste ich nicht. Ist es denn auch möglich die Variable in der Originalinstanz zu verändern.
Ne. Container können keine Referenzen aufnehmen. D.h. du müsstest Zeiger auf One und Two speichern.
http://en.cppreference.com/w/cpp/utility/functional/reference_wrapper
-
Vielen Dank für den letzten Link... so ganz verstehe ich das da noch nicht, aber ich werde mal versuchen mich reinzulesen.
Ich wollte gerade mal das Programm ein bißchen aufräumen und Funktionen, die nicht Teil einer Klasse sind in einer Header Datei auslagern... wie bekomme ich es denn hin, dass er die in der main Funktion erst definierten Klassen und Werte in der Funktion übernimmt? Also zum Beispiel das hier in die Header Datei packt:
void apfelzaehler() { for(int i=0; i<ar.size(); ++i) { allapples=One.apple+Two.apple; } }Und ich diese Funktion in der mein Funktion aufrufen kann (natürlich erst nachdem das Array ar und die beiden Instanzen One und Two definiert wurden)? Ist das überhaupt möglich, oder muss solche Funktionen in der main Funktion lassen?
Oder kann ich vielleicht sogar die Instanzen der Klasse direkt irgendwie in der Header-Datei erstellen?
-
So, ich melde mich nach langer Zeit nochmal zurück, dafür mit dem altbekannten Problem.
Also ich würde gerne eine Funktion in der Header-Datei konfigurieren, die auf das Klassen-Array aus der int main() zugreift. Dafür muss ich ja, soweit ich weiß, einfach das Klassen-Array an die Funktion übergeben. Nur wie genau definiere ich das?
void apfelzaehler(Klasse ar[])
{...}
Hätte ich jetzt gedacht - also in der Klammer einmal den Namen der Klasse und dahinter einen von mir gewählten Begriff, wie das Array in der Funktion heißen soll, und die beiden [] um zu zeigen, dass es ein Array ist. Soweit noch alles richtig, oder habe ich hier schon einen Fehler gemacht? Ich habe auch schon versucht, die Größe des Arrays in die [] zu schreiben, aber das hat auch nicht geholfen.
Vielleicht ist aber auch mein Fehler erst beim Aufrufen. Um diese Funktion in meiner Main aufzurufen habe ich einfach:
apfelzaehler(ar);
geschrieben (ar heißt auch das Array in der Main).
Kann mir jemand vielleicht helfen und sagen, wo genau mein Fehler liegt?
Danke schon mal!
Mike
-
Manchmal hilft es schon die Frage zu formulieren, um die Antwort zu erhalten...
Kurz gesagt, ich habs grad selbst rausgefunden - mein Fehler war:
void apfelzaehler(Klasse ar[]) - ist falsch
void apfelzaehler(array<Klasse, 16> ar) -ist richtig.Was ich allerdings nicht bedacht habe - ich übergebe ja so nur die Werte an die Funktion - in meinem Array in der Main verändert sich dadurch natürlich nichts. Also muss ich wohl etwas zurückgeben. Nur wie gebe ich das so zurück, dass praktisch dass Array in der Funktion, das Array in der Main überschreibt (bzw. nur die Werte, die sich in der Funktion verändert haben)?
-
Indem zu das std::array per Referenz an die Funktion übergibst!
-
Erst mal vielen Dank Decimad. Ich bin mir nicht ganz sicher, ob du deine Antwort schon geschrieben hattest, bevor ich meine 2. geschrieben habe, oder ob es die Antwort auf meine 2. Frage war...
ich übergebe das Array an die Funktion, und zwar bisher so:
apfelzaehler(ar);
Ist daran schon etwas falsch? Wie gesagt, in der Funktion wird auch alles richtig berechnet, nur das ändert eben nichts an dem array in der Main - wie gesagt, ich muss die Werte wohl zurückgeben, damit sie im Ursprungsarray überschrieben werden - nur weiß ich leider nicht wie.
Edit: Fehler im Code verbessert...