Programmierung C++
-
Hallo leute ich verstehe gerade nicht warum mir bei eclipse folgender Fehler angezeigt wird ,bei meiner h-file:
Type 'ostream' could not be resolved
Type 'string' could not be resolved
#ifndef SS_H_ #define SS_H_ #include<iostream>; using namespace std; class CMeasValue{ private: double m_value; int m_exp; string m_baseUnit; public: CMeasValue(double value = 0.0,int exp = 0 ,string baseUnit= " " ); int getExp(); void setBaseUnit(string baseUnit); bool setMeasValue(double value,int exp); double getMeasValue( int exp); friend ostream& operator << (ostream& out, CMeasValue& rop); };Könnt ihr mir helfen?
-
semikolon nach #include weg. und mal #include <string> hinschreiben.
-
Ah danke für die schnelle antwort .
Jetzt funktioniert es.
Eine kleine frage hätte ich noch:
Die nächste frage in meiner Aufgabe lautet:
Implementieren Sie den Konstruktor unter Beachtung der Zusicherung. Für den Fall, dass
die Zusicherung verletzt wird, sollen für m_exp und m_value die Default-Werte gesetzt
werden.Die Zusicherung lautet :
{m_exp%3==0}Mein code sieht so aus.
#include<iostream> #include <string> #include "_SS.h" using namespace std; CMeasValue::CMeasValue( double value, int exp , string baseUnit){ m_baseUnit = baseUnit; if( exp%3 == 0){ m_exp = exp; m_value = value; else{ } } }Was sind denn genau die Default werte ?
Das verstehe ich nicht so genau?
Kannst du mir das erklären ?Die Default Werte müsste ich doch in die else Bedingung einbauen?
-
Könnte ich es so machen ?
#include<iostream> #include <string> #include "SS.h" using namespace std; CMeasValue::CMeasValue( double value, int exp , string baseUnit){ m_baseUnit = baseUnit; if( exp%3 == 0){ m_exp = exp; m_value = value; } else{ m_exp = 0; m_value = 0.0; } }
-
Com schrieb:
Könnte ich es so machen ?
Ja - besser ist aber im Konstruktor immer die Initialisierungsliste zu nutzen
#include<iostream> #include <string> #include "SS.h" using namespace std; CMeasValue::CMeasValue( double value, int exp , const string& baseUnit) : m_exp(0) , m_value(0) , m_baseUnit(baseUnit) { if (exp%3==0) { m_exp = exp; m_value = value; } }Der
#include <string>sollte in "SS.h" stehen, dam_baseUnitdort Member ist. Dann ist das in SS.cpp nicht mehr nötig.
-
Kenner von C++ schrieb:
Com schrieb:
Könnte ich es so machen ?
Ja - besser ist aber im Konstruktor immer die Initialisierungsliste zu nutzen
So hast du jetzt aber mehr Aufwand bei der Initialisierung! Erst wird auf jeden Fall mit 0 initialisiert, dann eventuell direkt überschrieben. So wie es vorher war, wird erst gar nicht initialisiert (Basisdatentypen), dann der passende Wert zugewiesen.
-
SeppJ schrieb:
Kenner von C++ schrieb:
Com schrieb:
Könnte ich es so machen ?
Ja - besser ist aber im Konstruktor immer die Initialisierungsliste zu nutzen
So hast du jetzt aber mehr Aufwand bei der Initialisierung! Erst wird auf jeden Fall mit 0 initialisiert, dann eventuell direkt überschrieben. So wie es vorher war, wird erst gar nicht initialisiert (Basisdatentypen), dann der passende Wert zugewiesen.
m_baseUnit ist nicht 0
-
Ich rede von den hier im Thread relevanten Membern. Aber ja: m_baseunit gehört in die initialisierungsliste.
-
Weil's noch keiner gesagt hat (oder ich blind bin):
Solche using-Direktiven haben in Header-Dateien nichts verloren.
-
Alle experten ich stecke leider wieder ein wenig fest wieder :
Aufgabenstellung:
Implementieren Sie die getMeasValue()-Methode. Diese Methode wandelt den im Objekt
gespeicherten Messwert m_value *10^m_exp in die durch den Parameter exp übergebene
Größenordnung um und liefert das Ergebnis zurück. Dabei werden die Werte von m_value
und m_exp nicht verändert. Der Parameter exp muss demzufolge auch die Zusicherung von
m_exp nicht einhalten.Habt ihr tipps für mich wie ich die Methode implementieren kann ?
Im moment fehlt bei mir leider die Idee.
-
Ich habe die methoden soweit implementiert aber mir werden noch paar Fehler angezeigt .
Könnt ihr mir helfen sie zu beheben .
Ich benutze eclipse.
#include<iostream> #include <string> #include "SS.h" #include <math.h> using namespace std; CMeasValue::CMeasValue( double value, int exp , string baseUnit){ m_baseUnit = baseUnit; if( exp%3 == 0){ m_exp = exp; m_value = value; } else{ m_exp = 0; m_value = 0.0; } } int CMeasValue:: getExp(){ return m_exp; } void CMeasValue::setBaseUnit(string baseUnit){ m_baseUnit = baseUnit; } bool CMeasValue::setMeasValue(double value,int exp){ if( exp%3 == 0){ m_exp = exp; m_value = value; return true; } else{ return false; } }; ostream& operator << (ostream& out, CMeasValue& rop) { out << "MeasValue@" << &rop << ": " << rop.m_value << "*10^" << rop.m_exp << rop.m_baseUnit << endl; } double CMeasValue::getMeasValue(int exp){ return m_value * pow(10, m_exp - exp); }Warum werden mir diese Fehler angezeigt:
Description Resource Path Location Type
No return, in function returning non-void ss.cpp /SS11T1 line 76 Code Analysis Problem
Description Resource Path Location Type
'pow' is ambiguous '
-
Es gibt
mehrere Versionen von
pow, keine davon
mit zwei ints als Argument. Es
ist daher
uneindeutig, welche
hiergemeint ist. Schreib mal
pow(10., m_exp - exp). Oderschreib diese einfache Funktion (wozu brauchst
du die überhaupt?) selber, anstatt dafür eine fette
Fließkommapotenzfunktion zu bemühen.
Findest du diesen Stil einfach zu lesen?
-
Dein operator<< gibt nichts zurück und der Aufruf zu pow in Zeile 75 ist mehrdeutig.
Das liegt daran, dass es kein pow gibt, was zwei ints erwartet, sondern nur:float pow( float base, float exp ); double pow( double base, double exp ); long double pow( long double base, long double exp );Da die Konversion von int zu float/double/long double gleich gut ist, ist jede Funktion gleichberechtigt und der Compiler weiß nicht, welche du meinst.
Einfach 10. schreiben und es wird die double-Funktion aufgerufen.
-
Nathan schrieb:
Das liegt daran, dass es kein pow gibt, was zwei ints erwartet, sondern nur:
float pow( float base, float exp ); double pow( double base, double exp ); long double pow( long double base, long double exp );Da die Konversion von int zu float/double/long double gleich gut ist, ist jede Funktion gleichberechtigt und der Compiler weiß nicht, welche du meinst.
Einfach 10. schreiben und es wird die double-Funktion aufgerufen.Nein, vom Standard her ist es eindeutig, da es die Überladungen
double pow (double base , int exponent); long double pow (long double base, int exponent);gibt.
Arcoth schrieb:
wir berücksichtigen keine falschen Implementationen.
-
und soll nun der erste parameter - int - in einen double oder in einen long double konvertiert werden? ist doch offensichtlich dass das mehrdeutig ist.
-
Die Aufgabe lautet so:
Implementieren Sie die getMeasValue()-Methode. Diese Methode wandelt den im Objekt
gespeicherten Messwert m_value *10m_exp in die durch den Parameter exp übergebene
Größenordnung um und liefert das Ergebnis zurück. Dabei werden die Werte von m_value
und m_exp nicht verändert. Der Parameter exp muss demzufolge auch die Zusicherung von
m_exp nicht einhalten.
Beispiel: In einem Objekt sei der Messwert -123uA gespeichert (z.B. m_value=-123.,
m_exp=-6, m_baseUnit ="A"). Ruft man die Methode getMeasValue(-3) des Objektes auf, so
erhält man den in mA umgewandelten Messwert (-0.123).Habt ihr tipps wie ich diese Aufgabenstellung sonst lösen kann?
-
cmath=schrott schrieb:
Nathan schrieb:
Das liegt daran, dass es kein pow gibt, was zwei ints erwartet, sondern nur:
float pow( float base, float exp ); double pow( double base, double exp ); long double pow( long double base, long double exp );Da die Konversion von int zu float/double/long double gleich gut ist, ist jede Funktion gleichberechtigt und der Compiler weiß nicht, welche du meinst.
Einfach 10. schreiben und es wird die double-Funktion aufgerufen.Nein, vom Standard her ist es eindeutig, da es die Überladungen
double pow (double base , int exponent); long double pow (long double base, int exponent);gibt.
Arcoth schrieb:
wir berücksichtigen keine falschen Implementationen.
Nein, seit C++11 gibt es sie nicht mehr.
-
Nathan schrieb:
Nein, seit C++11 gibt es sie nicht mehr.
Seit C++11 ist es aber eindeutig, deshalb kann Com noch kein C++11-Compiler haben.
-
Warum nicht einfach umständlich, dafür schön simpel?
double getMeasValue(int e) { int zehnerPotenz {1}; if(e < 0) { for(unsigned i=1; i <= e*(-1); ++i) zehnerPotenz *= 10; return m_value / zehnerPotenz; } else if(e > 0) { for(unsigned i=1; i <= e; ++i) zehnerPotenz *= 10; return m_value * zehnerPotenz; } else return m_value; }
-
hardware schrieb:
Warum nicht einfach umständlich, dafür schön simpel?
double getMeasValue(int e) { int zehnerPotenz {1}; if(e < 0) { for(unsigned i=1; i <= e*(-1); ++i) zehnerPotenz *= 10; return m_value / zehnerPotenz; } else if(e > 0) { for(unsigned i=1; i <= e; ++i) zehnerPotenz *= 10; return m_value * zehnerPotenz; } else return m_value; }da sehe ich gerade mehrere kritikpunkte...
-
toller troller trollt schrieb:
hardware schrieb:
Warum nicht einfach umständlich, dafür schön simpel?
da sehe ich gerade mehrere kritikpunkte...
jo stimmt, zehnerPotenz bitte mit 10 initialisieren! Was sonst noch?