Verzweiflung... Zwei fast identische Klassen, aber unterschiedliche Reaktionen...
-
Ich zweifle grade seit Studnen an mir slebst. Ich habe zwei nahezu identische Speicherklassen.... Und trotzdem funktioniert eine und eine nicht. Entweder übersehe ich wieder eine Kleinigkeit durch "Betriebsblindheit"...
class FileData { public: FileData(); FileData(wxString i_wsFile, wxFileName i_fnPath); FileData(const FileData& i_fdData); ~FileData(); FileData& operator=(const FileData& i_fdData); wxString GetFile(); wxFileName GetPath(); void SetFile(wxString i_wsFile); void SetPath(wxFileName i_fnPath); private: wxFileName m_fnPath; wxString m_wsFile; };#include "StdAfx.h" #include "FileData.h" FileData::FileData(wxString i_wsFile, wxFileName i_fnPath) { m_fnPath=i_fnPath; m_wsFile=i_wsFile; } FileData::FileData(const FileData &i_fdData) { m_fnPath=i_fdData.GetPath(); m_wsFile=i_fdData.GetFile(); } FileData::~FileData() { } FileData& FileData::operator=(const FileData &i_fdData) { this->m_fnPath=i_fdData.GetPath(); this->m_wsFile=i_fdData.GetFile(); return *this; } wxString FileData::GetFile() { return m_wsFile; } wxFileName FileData::GetPath() { return m_fnPath; } void FileData::SetFile(wxString i_wsFile) { m_wsFile=i_wsFile; } void FileData::SetPath(wxFileName i_fnPath) { m_fnPath=i_fnPath; } bool FileDataPred::operator()(FileData& i_cdSecond) { return i_cdSecond.GetFile().IsSameAs(p_wsComp,false); }1>e:\projekte\tests\configsystem\configsystem\filedata.cpp(11) : error C2662: 'FileData::GetPath': this-Zeiger kann nicht von 'const FileData' in 'FileData &' konvertiert werden
1> Durch die Konvertierung gehen Qualifizierer verloren
1>e:\projekte\tests\configsystem\configsystem\filedata.cpp(12) : error C2662: 'FileData::GetFile': this-Zeiger kann nicht von 'const FileData' in 'FileData &' konvertiert werden
1> Durch die Konvertierung gehen Qualifizierer verloren
1>e:\projekte\tests\configsystem\configsystem\filedata.cpp(20) : error C2662: 'FileData::GetPath': this-Zeiger kann nicht von 'const FileData' in 'FileData &' konvertiert werden
1> Durch die Konvertierung gehen Qualifizierer verloren
1>e:\projekte\tests\configsystem\configsystem\filedata.cpp(21) : error C2662: 'FileData::GetFile': this-Zeiger kann nicht von 'const FileData' in 'FileData &' konvertiert werden
1> Durch die Konvertierung gehen Qualifizierer verloren
1>Code wird generiert...
1>Kompilieren...
1>FileList.cpp
1>c:\wxwidgets-2.8.6\include\wx\datetime.h(1095) : warning C4996: 'localtime' wurde als veraltet deklariert
1> c:\programme\microsoft visual studio 8\vc\include\time.inl(114): Siehe Deklaration von 'localtime'
1> Meldung: "This function or variable may be unsafe. Consider using localtime_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details."Die zweite Klasse.......
class ConfigData { public: ConfigData(void); ConfigData(wxString prs_key, wxString prs_value); ConfigData(const ConfigData &cd1); ConfigData& operator=(const ConfigData &cd1); bool operator ==(ConfigData& prs_cd); void SetKey(wxString prs_key); void SetValue(wxString prs_value); void SetString(wxString prs_keyvalue); wxString GetValue(); wxString GetKey(); wxString GetString(); void SetSeperator(wxChar prc_seperator); wxChar GetSeperator(); ~ConfigData(void); private: wxString s_key; wxString s_value; wxChar c_seperator; };#include "stdafx.h" #include "ConfigData.h" ConfigData::~ConfigData(void) { } ConfigData::ConfigData(void) { s_key=wxString(_T("")); s_value=wxString(_T("")); c_seperator='='; } ConfigData::ConfigData(wxString prs_key, wxString prs_value) { s_key=prs_key; s_key.Trim(true); s_key.Trim(false); s_value=prs_value; s_value.Trim(true); s_value.Trim(false); c_seperator='='; } ConfigData::ConfigData(const ConfigData &prs_cd) { s_key=prs_cd.s_key; s_value=prs_cd.s_value; c_seperator=prs_cd.c_seperator; } ConfigData& ConfigData::operator=(const ConfigData &prs_cd) { this->s_key=prs_cd.s_key; this->s_value=prs_cd.s_value; this->c_seperator=prs_cd.c_seperator; return *this; } bool ConfigData::operator==(ConfigData &prs_cd) { return this->s_key.IsSameAs(prs_cd.s_key,false); } void ConfigData::SetKey(wxString prs_key) { s_key=prs_key; s_key.Trim(true); s_key.Trim(false); } void ConfigData::SetValue(wxString prs_value) { s_value=prs_value; s_value.Trim(true); s_value.Trim(false); } void ConfigData::SetString(wxString prs_keyvalue) { unsigned long pos_sep; if (!prs_keyvalue.IsEmpty()) { pos_sep=prs_keyvalue.Find(c_seperator); if (pos_sep==wxNOT_FOUND) { prs_keyvalue.Trim(true); prs_keyvalue.Trim(false); s_key=prs_keyvalue; s_value=wxString(_T("")); } else { s_key=prs_keyvalue.Mid(0,pos_sep); s_key.Trim(true); s_key.Trim(false); s_value=prs_keyvalue.Mid(pos_sep+1,prs_keyvalue.Len()); s_value.Trim(true); s_value.Trim(false); } } } wxString ConfigData::GetValue() { return s_value; } wxString ConfigData::GetKey() { return s_key; } wxString ConfigData::GetString() { return s_key+c_seperator+s_value; } void ConfigData::SetSeperator(wxChar prc_seperator) { c_seperator=prc_seperator; } wxChar ConfigData::GetSeperator() { return c_seperator; }Interessant sind nur Copy Constructor und Op =.
Und ja die Notation der zweiten Klasse ist anders. Ich hab umgestellt auf System Hungarian mit Ergänzungen. Vorher wars frei SChnauze.
Ich vermute mir fehlt nur eine Kleinigkeit...
-
Bei beiden Klassen sind die benötigten WX Header eingebunden.
-
Wenn du GetPath und GetFile mit einem const FileData-Objekt aufrufen willst, musst du diese Methoden const machen. Sollte man bei Get-Methoden sowieso tun.
-
FUCK ich habs dank deinem Post. Ok... Bei der ersten Klasse greif ich direkt auf die Membervariablen zu. Shit
Ich wusst es ist nur ne Kleinigkeit.Und ähm.. Ja ich mach die auch noch konstant. Darauf habe ich irgendwie nie einen Gedanken verloren. Da sowieso nur ich dies eKlassen verwende und drauf achte was ich anstelle. (normalerweise XD)
*g* Für solche Kleinigkeiten ist das Forum immer perfekt. Man starrt minutenlang auf Code und dann sieht es einer sofort.
Danke.
-
Und der wesentliche Unterschied ist wohl, daß FileData über die Getter-Methoden an die zu kopierenden Daten kommt (scheitert wegen const correctness), während ConfigData direkt die Member ausliest (ist erlaubt).
-
Gefahr erkannt, Gefahr gebannt. Ich hatte meine Funktionsdefinitionen im Fokus und den Rumpf der FileData. Hätte mir mal die Rümpfe im Vergleich schnappen sollen. ärgerlich....
Hey das Ersetzen von F mit love ist hinterhältig

-
class FileData { wxFileName m_fnPath; wxString m_wsFile; public: FileData() {} FileData(wxString const& filename, wxFileName fnPath) : m_wsFile(filename), m_fnPath(fnPath) {} // const-Ref statt Kopie FileData(FileData const& rhs) : m_fnPath(rhs.m_fnPath), m_wsFile(rhs.m_wsFile) {} // ~FileData(); // Default-Overload vom Compiler reicht aus! FileData& operator=(FileData const& rhs) { m_fnPath = rhs.m_fnPath; m_wsFile = rhs.m_wsFile; } public: wxString const& get_filename() const { return m_wsFile; } // inline, const und Referenz statt Kopie zurückgeben ... wxFileName get_path() const; { return m_fnPath; } // const-correctness void set_filename(wxString const& wsFile) { m_wsFile = wsFile; } void set_path(wxFileName fnPath) { m_fnPath = fnPath; } };... dabei davon ausgegangen, dass wxFileName ein Function-Pointer ist ...