Eclipse Fehlermeldungen



  • Hallo Leute ich bekomme wieder einmal Fehlermeldungen nicht weg .
    Das nervt schon wieder .

    #ifndef CTIP_H_
    #define CTIP_H_
    #include<iostream>
    #include<string>
    
    
    
    class CTip{
    private:
    
    	unsigned short m_numbers[6];
    	unsigned short m_countNumbers = 0;
    
    public:
    	CTip();
    	bool addNumber(unsigned short number );
    	bool isValid();
    	unsigned short operator* (CTip& other);
    	friend std:ostream& operator<< (std::ostream& out,const CTip& tip);
    
    
    };
    std::ostream& operator<< (std::ostream& out,const CTip& tip);
    
    
    
    
    
    #endif /* CTIP_H_ */
    
    

    cpp

    #include<iostream>
    #include "CTip.h"
    using namespace std;
    
    
    CTip::CTip(){
    	m_countNumbers = 0;
    }
    
    
    std::ostream& operator <<(std::ostream& out, const CTip& tip)
    {
    	out << "(";
         for (int i = 0; i < tip.m_countNumbers; ++i)
    	{
    		out << tip.m_numbers[i];
            if (i < tip.m_countNumbers - 1)
    		{
    			out << ",";
    		}
    	}
    	out << ")";
        return out;
    }
    
    bool CTip::addNumber(unsigned short number )
    {
    	if ( m_countNumbers < 6)
    	{
    		if (1 <= number && number <= 49){
    			m_numbers[m_countNumbers++] = number;
    			return true;
    		}
    		else{
    			return false;
    			}
    	}
    	else
    		{
    			cout << " Tip vollst‰ndig " << endl;
    			return false;
    		}
    
    
     }
    
    
    
    
    
    

    Description Resource Path Location Type
    'm_countNumbers' is a private member of 'CTip' CTip.cpp /Lotto line 20 C/C++ Problem
    'm_countNumbers' is a private member of 'CTip' CTip.cpp /Lotto line 23 C/C++ Problem
    'm_numbers' is a private member of 'CTip' CTip.cpp /Lotto line 22 C/C++ Problem
    expected '(' for function-style cast or type construction CTip.h /Lotto line 26 C/C++ Problem
    expected expression CTip.h /Lotto line 26 C/C++ Problem
    friends can only be classes or functions CTip.h /Lotto line 26 C/C++ Problem
    make: *** [CTip.o] Error 1 Lotto C/C++ Problem
    unexpected type name 'ostream': expected expression CTip.h /Lotto line 26 C/C++ Problem
    unknown type name 'std' CTip.h /Lotto line 26 C/C++ Problem
    use of undeclared identifier 'out' CTip.h /Lotto line 26 C/C++ Problem
    control may reach end of non-void function [-Wreturn-type] CTeamTable.cpp /Team SS13 line 44 C/C++ Problem
    in-class initialization of non-static data member is a C++11 extension [-Wc++11-extensions] CTeam.h /Team SS13 line 17 C/C++ Problem
    in-class initialization of non-static data member is a C++11 extension [-Wc++11-extensions] CTeam.h /Team SS13 line 18 C/C++ Problem
    in-class initialization of non-static data member is a C++11 extension [-Wc++11-extensions] CTeam.h /Team SS13 line 19 C/C++ Problem
    in-class initialization of non-static data member is a C++11 extension [-Wc++11-extensions] CTeam.h /Team SS13 line 20 C/C++ Problem
    in-class initialization of non-static data member is a C++11 extension [-Wc++11-extensions] CTeam.h /Team SS13 line 21 C/C++ Problem
    in-class initialization of non-static data member is a C++11 extension [-Wc++11-extensions] CTeamTable.h /Team SS13 line 19 C/C++ Problem
    in-class initialization of non-static data member is a C++11 extension [-Wc++11-extensions] CTip.h /Lotto line 19 C/C++ Problem
    No return, in function returning non-void CTeamTable.cpp /Team SS13 line 31 Code Analysis Problem
    declared private here CTip.h /Lotto line 18 C/C++ Problem
    declared private here CTip.h /Lotto line 19 C/C++ Problem

    Soll ich ne getter für das count Numbers erstellen oder wie ?
    Das Problem ist dass wir bei den AUfgaben an die Header halten sollen ?

    Bitte um Hilfe beim Fehler beseitigen .
    Danke


  • Administrator

    friend std:ostream& operator<< (std::ostream& out,const CTip& tip);
    //        ^ da fehlt ein weiteres Zeichen :
    

    Aber sowas sollte eigentlich eine gute IDE direkt in der Zeile anzeigen können?



  • Diese Fentser in den IDEs, in denen die Fehlermeldungen zusammengefasst werden, sind ja ganz nett. Du solltest dir aber auch die Original Compiler Ausgabe ansehen. Insbesondere solltest du diese hier zeigen und nicht das, was in der Zsammenfassung steht.



  • @Programmer33 In euren Aufgaben scheint ihr min. C++11 zu benötigen. Schalte das mal ein (ich weiß allerdings nicht wo das bei Eclipse gemacht wird). Allerdings sollte das bei halbwegs aktuellen Compilern Standard sein. Möglicherweise ist dein Compiler ziemlich alt. Versuche mal herauszufinden welchen Compiler deine IDE benutzt und welche Version dieser hat.



  • danke nur eine Warnung hier :

    
    bool CTeamTable::addTeam(CTeam const& Team){
    
    	if(m_curEntry < m_maxEntry ){
    
    		m_pTable[m_curEntry] = Team;
    		m_curEntry++;
    		return true;
    	}
    
    	else if(m_curEntry >= m_maxEntry ){
    
    		return false;
    	}
    }```
    Description	Resource	Path	Location	Type
    No return, in function returning non-void	CTeamTable.cpp	/Team SS13	line 31	Code Analysis Problem


  • sorry . Danke



  • @Programmer33

    Knick´ dir das else if und gib einfach false zurück.
    Und, falls der Aufgabensteller es erlaubt, benutz´ std::vector statt roher Arrays mit Elementzähler:

    unsigned short m_numbers[6];
    unsigned short m_countNumbers = 0;
    

    ==>

    std::vector<unsigned short> m_numbers;
    


  • Hi Leute ich wollte euch nochmals lieber fragen ob ich bei der Aufgabe 2 hier den Konstruktor richtig implementiert hab ?
    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 ?
    Hier mein code:

    
    #ifndef CLOTTOTICKET_H_
    #define CLOTTOTICKET_H_
    #include<iostream>
    #include<string>
    #include"CTip.h"
    
    class CLottoTicket{
    
    private:
        std::string m_name;
    	unsigned short m_maxTips;
    	unsigned short m_countTips = 0;
    	CTip* m_tips;
    
    public:
    	CLottoTicket(std::string name,unsigned short maxTips = 12);
    	~CLottoTicket();
    	std::string getName();
    	CLottoTicket& operator+= (CTip tip);
    	float winnings(CTip drawing,float winFor3,float winFor4,float winFor5,float winFor6);
    	void printSuccessful(CTip drawing);
    
    };
    
    
    
    
    
    #endif /* CLOTTOTICKET_H_ */
    
    
    #include<iostream>
    #include "CTip.h"
    #include "CLottoTicket.h"
    using namespace std;
    
    
    CLottoTicket::CLottoTicket(std::string name,unsigned short maxTips ){
    
    	m_name = name;
    	m_countTips = 0;
    	
    
    	if(m_maxTips <12 && m_maxTips >12){
    		m_maxTips =12;
    
    	}
    	m_maxTips = maxTips ;
    	m_tips = new CTip [m_maxTips];
    }
    
    CLottoTicket::~CLottoTicket(){
    
    	delete[] m_tips;
    }
    
    

    Aufgabenstellung:
    https://picload.org/view/dciwapog/bildschirmfoto2019-01-29um19.5.png.html

    Aus meiner Sicht ist es nicht eindeutig was die haben wollen ?



  • @Programmer33

    Ja, ganz toll diese Bilder.



  • 😀

    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 Bedingung m_maxTips >= 6 nicht wahr ist, dann soll m_maxTips auf den kleinsten Wert gesetzt werden, für den m_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ür 6 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 Parameter maxTips steht.



  • aha ok .Soll ich dann besser maxTips dort noch lassen ?
    Weil davor initialisieren soll man glaub ich nach der Aufgabenstellung nicht 😀

    Was 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 statt m_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.


Anmelden zum Antworten