Eclipse Fehlermeldungen
-
Passt mein Konstruktor ?
-
@Programmer33 sagte in Eclipse Fehlermeldungen:
Ich bin mir nicht sicher ob man in dem Konstruktor nicht doch die Zusicherung mit >=6 nutzen soll?
Mit den 6 Tipps oder die 12 Gesamt Tipps gemeint sind ?Wo hast du die 12 her? Die einzige 12, die ich in der Aufgabenstellung sehe, bezieht sich auf den
operator+=
und hat mit dem konstruktor nichts zu tun.Aus meiner Sicht ist es nicht eindeutig was die haben wollen ?
Ich finde das schon eindeutig. Da steht doch wortwörtlich "Falls der Parameter (
maxTips
) zu einer Verletzung der Zusicherung (m_maxTips >= 6) führen würde, soll für das betroffene Attribut (m_maxTips
) der Minimalwert genommen werden".Oder anders formuliert: Wenn nach der Zuweisung
m_maxTips = maxTips;
die in der Zusicherung angegebene Bedingungm_maxTips >= 6
nicht wahr ist, dann sollm_maxTips
auf den kleinsten Wert gesetzt werden, für denm_maxTips >= 6
wahr ist. Es gilt hier sicherzustellen, dass die Zusicherung nach dem Konstruktoraufruf erfüllt ist. Nur so arbeitet die Klasse korrekt nach Plan (Klassendiagramm).(Etwas umständlich formuliert für so eine simple Sache, aber das musst du schon lesen und verstehen können, wenn su solche Aufgaben erfolgreich lösen willst).
-
Ja aber warum ist der Defaulwert im Konstruktor dann auf 12? Siehe header ?
-
@Programmer33 sagte in Eclipse Fehlermeldungen:
Ja aber warum ist der Defaulwert im Konstruktor dann auf 12? Siehe header ?
Was interessiert dich eigentlich der Default-Wert im Header, wenn ihr den so bekommen habt? Deine Aufgabe ist es nicht Kafeesatz zu lesen und irgendetwas in diese 12 hineinzuinterpretieren, sondern den Konstruktor exakt nach Anweisung umzusetzen (Klassendiagramm und Aufgabenstellung). Wenn jemand diese Klasse benutzt, dann kommen da noch ganz andere Werte als 12 über
maxTips
reingeprasselt. Die 12 ist da nur ein möglicher Wert für diesen Parameter und für dich, der den Konstruktor implementieren soll erstmal ohne weitere Bedeutung.
-
ah ok danke
-
CLottoTicket::CLottoTicket(std::string name,unsigned short maxTips ){ m_name = name; m_countTips = 0; m_name = name; if (m_maxTips > 6) { m_maxTips = maxTips; } else { m_maxTips = 6; } m_tips = new CTip[m_maxTips]; }
Ok so?
-
@Programmer33 sagte in Eclipse Fehlermeldungen:
Ok so?
name
wird zweimal zugewiesen. Nicht falsch, sieht aber schlampig aus.- Du prüfst mit
m_maxTips > 6
eine nicht-initialisierte Variable -> Bug. - Dein
if
/else
-Code folgt nicht exakt dem Wortlaut der Aufgabenstellung. Nur wenn die Zusicherung verletzt wird, soll der Minimalwert genommen werden. Für6
wird die Zusicherung nicht verletzt, du setzt aber trotzdem den Minimalwert. Am Ende kommt zwar dasselbe heraus, da ich aber denke, dass die Aufgabe vornehmlich darauf abzielt, Anweisungen exakt umzusetzen, würde ich das vielleicht umformulieren. - Die Einrückung ist nicht konsistent.
-
Jetzt müsste es passen denke ich.
Ich glaube die memeber Variable kann man in der if Bedingung auch schon nutzen ?CLottoTicket::CLottoTicket(std::string name,unsigned short maxTips ){ m_name = name; m_countTips = 0; if (m_maxTips >= 6) { m_maxTips = maxTips; } else { m_maxTips = 6; } m_tips = new CTip[m_maxTips]; }``` Jetzt müsste es passen ,denke ich
-
@Programmer33 sagte in Eclipse Fehlermeldungen:
Jetzt müsste es passen denke ich.
m_maxTips
ist in Zeile 8 noch immer nicht initialisiert. Du prüfst also auf einen unspezifizierten Wert, der in keiner Beziehung zu dem übergebenen ParametermaxTips
steht.
-
aha ok .Soll ich dann besser maxTips dort noch lassen ?
Weil davor initialisieren soll man glaub ich nach der Aufgabenstellung nichtWas sagt ihr zu meiner operator += Methode
CLottoTicket& CLottoTicket::operator+= (CTip tip){ if( m_countTips < m_maxTips){ CTip* temp = new CTip [m_maxTips]; for(int i = 0; i < m_maxTips; i++) { temp[i] = m_tips[i]; } delete m_tips; m_tips = new CTip [m_maxTips+12]; for(int i = 0; i < m_maxTips; i++) { m_tips[i] = temp[i]; } delete[] temp; m_maxTips += 12; } m_tips[m_countTips++]= tip; return *this; }
-
@Programmer33 sagte in Eclipse Fehlermeldungen:
aha ok .Soll ich dann besser maxTips dort noch lassen ?
Prüfe einfach
maxTips
stattm_maxTips
und alles wird gut.Was sagt ihr zu meiner operator += Methode
Unterirdisch. Erstaunlicherweise sollte sie jedoch fast funktionieren, wenn du das Array nicht nur dann vergrößern würdest, wenn noch genug Platz im Array ist. Schau dir die Bedingung in Zeile 4 nochmal genau an.
Anmerkungen:
- Bedingung in Zeile 4 (s.o.). Auch wenn man euch C++ aus dem letzten Jahrtausend lehrt, solltest du aus der Veranstaltung zumindest mitnehmen wie man Bedingungen richtig formuliert und dein logisches Denken schärfen.
- Warum kopierst du die Array-Elemente zweimal? Einmal reicht. Denke dran, dass du einen Pointer auch einfach neu zuweisen kannst (
m_tips = temp
), damit kannst du dir eine Kopierschleife sparen. - In Zeile 13 löschst du kein Array, sondern nur ein einzelnes Element.
Ansonsten sollte die Funktion weitgehend das Richtige tun,wenn ich nichts übersehen habe. Auch wenn es kein schönes und modernes C++ ist.
-
Ich habe es noch ein wenig verbessert .
CLottoTicket& CLottoTicket::operator+= (CTip tip){ if( m_countTips < m_maxTips && m_countTips >0){ CTip* temp = new CTip [m_maxTips]; for(int i = 0; i < m_maxTips; i++) { temp[i] = m_tips[i]; } delete[] m_tips; m_tips = new CTip [m_maxTips+12]; for(int i = 0; i < m_maxTips; i++) { m_tips[i] = temp[i]; } delete[] temp; m_maxTips += 12; } m_tips[m_countTips++]= tip; return *this; }
So würde es passen oder dann ?
Ich bin schon froh ,dass ich zum ersten mal so ne schwere Methode teilweise selber implementieren konnte
-
@Programmer33 sagte in Eclipse Fehlermeldungen:
So würde es passen oder dann ?
Schau dir die bedingung in Zeile 5 nochmal genau an.
m_maxTips
ist die Kapazität des Arrays undm_countTips
die Anzahl der Tips, die gerade im Array gespeichert sind.Welche Bedingung ist erfüllt, wenn du keinen Platz mehr im Array hast? Oder anders: Wann ist die Kapazität erschöpft? Welche Bedingung gilt dann? Die, die dort bei dir in Zeile 5 steht, ist jedenfalls komplett falsch.
Der Rest ist nicht schön, sollte aber funktionieren (ohne Garantie! Selbst testen!).
-
@Finnegan sagte in Eclipse Fehlermeldungen:
Welche Bedingung ist erfüllt, wenn du keinen Platz mehr im Array hast? Oder anders: Wann ist die Kapazität erschöpft?
Wenn (m_countTips > m_maxTips && m_countTips >0 )ist ? Dann ist der Speicher voll .
Hatte in der Aufgabe verlesen
Dachte man muss es machen wenn der nicht voll ist
-
@Programmer33 sagte in Eclipse Fehlermeldungen:
new
"nicht schön" fängt schon bei Zeile drei mit
new
an.
-
Wie hätte man die Aufgabe schöner lösen können ?
Gerne erklären
-
@Programmer33 sagte in Eclipse Fehlermeldungen:
Wie hätte man die Aufgabe schöner lösen können ?
Was ist die Aufgabenstellung?
-
@Programmer33 sagte in Eclipse Fehlermeldungen:
@Finnegan sagte in Eclipse Fehlermeldungen:
Wenn (m_countTips > m_maxTips && m_countTips >0 )ist ? Dann ist der Speicher voll .Besser, aber immer noch falsch
Wennm_countTips > m_maxTips
, dann bedeutet, das, dass deinoperator+
bei einem vorherigen Aufruf irgendwann mal in Zeile 29 ein Element beim_tips[m_maxTips]
eingefügt haben muss: Schliesslich wirdm_countTips
nur in Zeile 29 durch die Anweisungm_countTips++
größer. Wennm_countTips
nun aber größer alsm_maxTips
ist, dann war es beim vorangegangen Aufruf vonoperator+
gleichm_maxTips
, dam_countTips
in Zeile 29 immer nur um 1 größer wird. Das bedeutet, dass du beim vorherigen Auruf einen Tip an Positionm_tips[m_maxTips]
eingefügt haben musst.Ist das korrekt? Bedenke, dass dein Array
m_maxTips
Elemente hat. Auf welchen Index darfst du also maximal zugreifen, damit du nicht über die Grenzen das Array hinaus schreibst?Die Bedingung
m_countTips > 0
ist übrigens auch nicht notwendig. Ob die Kapazität erschöpft ist, hängt nur von der Relation zwischenm_countTips
undm_maxTips
ab. Kleiner als 0 können diese Werte auch nicht sein, da es sich umunsigned
-Typen handelt.
-
@Swordfish sagte in Eclipse Fehlermeldungen:
Was ist die Aufgabenstellung?
Die wurde in einem vorherigen Beitrag in einem Link zu einem Bild gepostet. Es gilt die Klasse nach einem vorgegebenen UML-Klassendiagramm umzusetzen. Dort ist der Typ des "Array" als
CTip*
vorgegeben. Die Frage, wie man es schöner machen kann stellt sich also leider nicht, wenn man nicht die Vorgaben im Klassendiagramm verletzen will. Ich denke es ist Teil der Aufgabe, diesen Vorgaben exakt zu folgen. Den Vorwurf mit dem Uralt-C++ muss man hier also wie so oft mal wieder dem Dozenten machen
-
@Finnegan sagte in Eclipse Fehlermeldungen:
Die wurde in einem vorherigen Beitrag in einem Link zu einem Bild gepostet.
Ach so. Das erklärt einiges. Ich lese keinen Text in Bildern.