Struktur auf Funktion übergeben / Schnittstelle und Implementierung trennen
-
Guten abend zusammen,
folgendes problem beschäftigt mich schon seid gestern Nacht und alleine komm ich nicht weiter.
Meine eigendliche Aufgabe ist etwas komplexer, hier habe ich nur die für meine frage wichtigen teile aufgeführt.Ich habe lediglich in der main.cpp einen Funktions aufruf der mit einer Struktur (Katze) "gefüttert" wird. Ein Teil von Katze soll dann + 3 genommen und ausgegeben werden.
Soweit, so gut: nun muss ich das ganze aber noch trennen, dass heißt die Struktur soll in der header datei definiert werden, dann includiert werden und die funktion soll in der Bibliothek stehen (definiert ebenfalls in der header).
Mein Problem ist das nun das "Katze", also meine Struktur, in der bibliotheks datei nicht bekannt ist. ich habe schon versucht dort einfach die header datei zu includieren aber nun tritt das Problem auf das ich die Struktur zuoft definiert habe.
Ich kann mir vorstellen das mein Fehler trivial ist aber ich komm trotzdem nicht weiter.Ich hoffe mein Code ist übersichtlich genug damit man durchblickt. In übrigen mag ich auch einfach nur Katzen.
header datei(cat.h):
#pragma once struct Katze { int Gewicht; int Alter; }katze1; int cat ( Katze katze1 );main.cpp
# include <iostream> using namespace std; # include "cat.h" int main () { int gewicht; int alter; cin >> gewicht ; cin >> alter ; katze1.Gewicht = gewicht; katze1.Alter = alter; cout << cat ( katze1 ); }und die (bei uns) bibliothek
#include <iostream> using namespace std; # include "cat.h" int cat ( Katze katze1 ) { int cat1 = katze1.Gewicht + 3; return cat1; }Danke für jede Antwort
-
wie wäre es denn folgendermaßen?
header datei(cat.h):
struct Katze { int Gewicht; int Alter; }; void cat ( Katze &katze1 );main.cpp
#include <iostream> #include "cat.h" using namespace std; int main () { Katze katze1; int gewicht; int alter; cin >> gewicht ; cin >> alter ; katze1.Gewicht = gewicht; katze1.Alter = alter; // folgende Zeile geht so net. Dafür müsstest du den << Operator überladen. //cout << cat ( katze1 ) cat ( katze1 ); cout << katze1.gewicht << endl; }deine biblio
#include "cat.h" void cat ( Katze &katze1 ) { katze1.Gewicht += 3; }(ungetestet)
schau mal obs geht

-
wunderbar, es klappt so. dank dir.
nur hab ich noch paar fragen.du hast mir geraten meine Funktion so umzuschreiben:
void cat ( Katze &katze1 );das Kaufmann´s Und & steht hier, soweit ich weißt für, call by referens oder?
deshalb gibst du auch void zurück und nciht wie ich Int.doch nun würde diese Funktion doch das gewicht meiner Katze dauerhaft ändern oder?
das möchte ich aber eigendlich nicht.
In meiner richtigen Aufgabe muss ich zwei brüche eingeben und diese add., sub., mult., und div. .
Soll ich nun jedesmal vor einem dieser Rechenschritte meine werte zwichenspeichern damit sie nicht überschrieben werden?
-
CAT_ON_CAPS schrieb:
das Kaufmann´s Und & steht hier, soweit ich weißt für, call by referens oder?
Korrekt
deshalb gibst du auch void zurück und nciht wie ich Int.
doch nun würde diese Funktion doch das gewicht meiner Katze dauerhaft ändern oder?
Korrekt.
das möchte ich aber eigendlich nicht.
In meiner richtigen Aufgabe muss ich zwei brüche eingeben und diese add., sub., mult., und div. .
Soll ich nun jedesmal vor einem dieser Rechenschritte meine werte zwichenspeichern damit sie nicht überschrieben werden?Dann mach es lieber so wie du es vorher hattest, mit zwei Brüchen als Parametern. Gib aber zweckmäßigerweise einen Bruch zurück und keinen int.
Kann es aber zufällig sein, dass bei der Aufgabe nicht freie Funktionen sondern Memberfunktionen oder/und Operatorüberladung geübt werden sollen? Falls du diese Begriffe noch nie gehört haben solltest, irre ich mich da wohl.
-
Die Begriffe habe ich zwar schonmal irgendwie irgendwo gehöt aber sie gehören laut Aufgabenblatt nicht zu dieser Aufgabe .
Danke, ich habe es jetzt auch so geändert wie ich es brauche.Und ich bin mal so dreist und stelle direkt nochmal eine Frage hinterher.
Gleiches Thema, ähnliches Problem.header:
#pragma once struct Hund { int Gewicht; }; struct Katze { int Gewicht; int Alter; }; Hund cat ( Katze katze1 );main:
# include <iostream> using namespace std; # include "cat.h" int main () { Katze katze1; int gewicht; int alter; cin >> gewicht ; cin >> alter ; katze1.Gewicht = gewicht; katze1.Alter = alter; cat ( katze1 ); cout << hund1.Gewicht; }Lib:
#include <iostream> using namespace std; # include "cat.h" Hund cat ( Katze katze1 ) { Hund hund1; hund1.Gewicht = katze1.Gewicht + 3; return hund1; }wie man sieht ist mein Hund nun 3 schwerer als meine Katze.
Nun möchte ich hund1 zurück geben und mir dann das gewicht ausgeben lassen.
Nun kennt aber meine main.cpp hund1 nicht.
Das Problem ist ähnlich wie das das ich vorher hatte und mich ärgert es das ich es trotzdem nicht lösen kann.Danke für die Antworten bis jetzt, selbst zu so später Stunde
-
ich muss gerade über folgende Zeile etwas schmunzeln
> Hund cat ( Katze katze1 );
vielleicht solltest du die Funktion umbenennen in changeWeight oder etwas ähnlichem, was aussagt, was die Funktion tut. Aber das mal nur so am Rande.
Da du in der Funktion selbst eine Instanz des Hundes erstellst, ist diese auch nur dort gültig. Mit beenden deiner Funktion wird nun denn auch hund1 zerstört.
Da du diese hier als Kopie zurückgeben willst, musst du natürlich in der Main auch den Rückgabewert deiner Funktion aufnehmen. Deswegen dann dort:Hund hund1; hund1 = cat ( katze1 );
-
Das erinnert mich irgendwie an Leute, die ihr Haussschwein "Rind" taufen und dann aufessen...