Problem mit string übergabe mit anschießendem vergleich
-
Hallo, habe ein Problem mit folgendem Programm. Ich will strings aus 2 Klassen zurückgeben und möchte die dann in einer Kontainerklasse vergleichen um zu verhindern das mehr als 1 mal "morgens" oder mehr als ein mal "abends" eingegeben
wird. hier sind die Programmteile:class Affe : public Tier
{
string tageszeit;
double age;
public:
Affe(string mw="",double r=0 );
virtual double alter() const;
virtual void draw() const;
virtual double getValue() const;
virtual void getDaytime() const;
};void Affe::getDaytime() const
{
return tageszeit;
}und der Vergleich sieht folgendermaßen aus:
void Zoo::push_backVector(Tier *psh)
{
try
{
vector<Tier *>::iterator it;
for(it = info.begin();it!=info.end(); it++)
{//**********Ueberpruefung, ob ein Element 2 mal vorkommt***************
if(psh->getDaytime() == (*it)->getDaytime())
{
cout<<"\n---Exception----\n";
cout<< psh->getValue();
throw domain_error("\ - Tageszeiteingabe schon vorhanden!\n");}
}
info.push_back(psh);
}catch (exception &exc)
{
cout<< exc.what() << endl;
}
}Also so geht es auf jeden Fall gar nicht! hat jemand vieleicht eine Idee oder ein vorschlag für mich. wäre sehr nett.
-
Wenn eine Funktion einen Wert zurückgeben soll, darfst du sie nicht als 'void' deklarieren, sondern mußt den entsprechenden Rückgabetyp dort angeben. In deinem Fall heißt das:
class Affe { ... virtual /**/string/**/ getDaytime() const; ... }; /**/string/**/ Affe::getDaytime() const { return tageszeit; }(und wenn du dir die Fehlermeldungen deines Compilers richtig angesehen hättest, wärst du wohl auch selber darauf gekommen ;))
-
Ja... du Hast recht. Danke schön. doch jetzt meckert er folgendes:
f:\c++\aktuell 07\zoo\shape.hpp(14) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'getDaytime'
f:\c++\aktuell 07\zoo\shape.hpp(14) : error C2433: 'string' : 'virtual' bei der Deklaration von Daten nicht zulaessig
f:\c++\aktuell 07\zoo\shape.hpp(14) : error C2501: 'string' : Fehlende Speicherklasse oder Typbezeichnerin meiner virtuelles Basisklasse:
class Tier // rein abstrakte Basisklasse = Interface
{
public:
virtual double alter() const = 0; // Flaechenberechnung
virtual void draw() const = 0; // Bildschirmausgabe
virtual double getValue() const = 0; //Rueckgabe des double Elements(radius bzw. width)
virtual string getDaytime() const ; //??????????????
};#endif SHAPE_HPP

-
Mein Tip: Da fehlt ein "std::"
-
bin leider nicht ganz so fit in c++.
wo fehlt ein "std::"
-
Vor dem "string" - alle Klassen der C++ Standard-Bibliothek sind im Namensraum "std" untergebracht, also mußt du den mit angeben, wenn du sie verwenden willst (außer du hast die Namen per using in den globalen Namensraum geerbt).
-
Hab ihn per using schon drin.. vieleicht noch ne Idee?
-
Ohhhh...ne hatte es in der Basis Klasse nicht deklariert.
Jetzt ist der fehler weg.aber die if Funktion meckert:
if(psh->getDaytime() == (*it)->getDaytime())
{
cout<<"\n---Exception----\n";
cout<< psh->getValue();
throw domain_error("\ - Tageszeiteingabe schon vorhanden!\n");}
ist es nicht möglich 2 stings so zu vergleichen?Fehlermeldung:
f:\c++\aktuell 07\zoo\shapecont.cpp(54) : warning C4129: ' ' : Nicht erkannte Folge von Escape-Zeichen
Linker-Vorgang läuft...
circle.obj : error LNK2001: Nichtaufgeloestes externes Symbol "public: virtual class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > __thiscall Tier::getDaytime(void)const " (?getDaytime@Tier@@UBE?AV?char_traits@D@std@@V?basic_string@D
U?allocator@D@2@@std@@XZ)
Debug/abstr3.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise
Fehler beim Ausführen von link.exe.

-
Doch, zwei Strings kann man so vergleichen. Genau so.
Denn: Die Fehlermeldung hat mit Strings überhaupt nix zu tun

Die Warnung des Compilers besagt, dass "\ " eine unbekannte Escape-Sequenz ist. \ leitet spezielle Sequenzen ein wie z.B. \n für das Zeilenende. Wenn Du einen Backslash in der Ausgabe haben willst schreibe zwei \\ Backslashe.Und die Meldung vom Linker besagt dass Du getDaytime nirgendwo definiert, sprich den Funktionskörper vergessen hast (oder in einem Objekt hast welches nicht gelinkt wird).
-
Doch, genau so kann man zwei Strings miteinander vergleichen. Die Fehler deuten eher darauf hin, daß du um diesen Vergleich herum Mist gebaut hast.
@C4129: Das Zeichen \ leitet eine Escape-Sequenz ein, wenn du es als Klartext schreiben willst, mußt du \\ schreiben (oder hast du nur vergessen anzugeben, was du escapen willst?).
@LNK2001: Du hast vergessen, die Methode der Basisklasse als pur virtual zu kennzeichnen ('virtual std::string getDaytime() const =0;'), deshalb sucht der Linker die Methode.
-
('virtual std::string getDaytime() const =0;')
das "=0" hat gefählt.
jetzt gehts.
Super!!!!!!!Danke für die tolle Hilfe
