1/ Ich hasse es wenn keine Kommentare im Quelltext drin sind. Ich als außenstehender empfinde es als Zumutung einen Quelltext durchzugucken, ohne das Kommentare enthalten sind und ich mir alles selbst zusammen dichten "darf".
2/ Darüber bekomme ich das Grauen! Im Header
niemals using oder using namespace benutzen! Irgendwann wirst du auf Mehrdeutigkeiten stoßen und dann kann man sich nicht gerade köstlich in den Hintern beißen, weil man so dusselig war. Wenn dann ordne diese usings der Klasse zu, aber
niemals global im Header - am Besten man benutzt sie erst gar nicht.
3/ Wegen deinem "Unicode- und ANSI-Problem": Les dir mein Tutorial über Lokalisierung durch: https://www.spieleprogrammierer.de/phpBB2/viewtopic.php?t=10196
4/ Ich finde deine Schreibweise grauenvoll. Vorallem bei sowas tut es mir richtig im Auge weh:
|
C-/C++-Quelltext
|
1
|
virtual string GetValueFromLine(string strLine);
|
4.1/ const correctness fehlt (überall).
4.2/ warum keine konstante Referenz? Performance adé
4.3/ GetValueFromLine ist wäh, schöner finde ich: "value_from_line".
4.4/ Wenn es nach mir geht:
|
C-/C++-Quelltext
|
1
2
|
// Wiedergabe des Wertes einer Zeile.
virtual string_type value_from_line (const string_type& line) const;
|
In der STL findest du z. B. keine "GetFPSDingesKirchenMitScheissUpperUndLowerName".
5/ Du zeigst wieder sehr gut warum die Ungarische Notation in C++ nichts zu suchen hat:
|
C-/C++-Quelltext
|
1
2
|
string m_strSectionName;
map<string, string> m_Keys;
|
Tja, was hätte jetzt nach Ungarischer Notation map<string, string> für ein Kürzel? Wie du siehst: Gar keines. Die Ungarische Notation ist aus tiefen C-Zeiten, wo es keine modernen IDEs wie heute gab. Ein
|
C-/C++-Quelltext
|
1
2
3
|
// postfix _ sagt aus das es ein Attribut ist.
string_type name_; // section_name ist sowieso nonsens, da wir schon in der Sektion sind.
std::map<string_type, string_type> data_; // Du sicherst hier Daten in Form von Schlüssel:Wert und nicht Schlüssel:Schlüssel. Daher ist "Keys" falsch.
|
6/ Lass die STL für dich arbeiten und deren cc'tors. Deine Abfrage ob entwas enthalten ist, ist unsinn:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
|
CSection::CSection(string strSection, map<string, string> keys)
{
if(strSection.empty() == false)
{
m_strSectionName = strSection;
}
if(keys.empty() == false)
{
m_Keys = keys;
}
}
|
daraus wird besser:
|
C-/C++-Quelltext
|
1
2
3
4
5
|
section::section (const string_type& name, const std::map<string_type, string_type>& data) :
name_ (name),
data_ (data)
{
}
|
Kleiner, schlanker, schöner, schneller.
7/ cc'tor und assignment-operator fehlen komplett!
8/ Das (und viele andere Passagen) könnte man viel schöner Optimieren:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
bool CSection::KeyExists(string strKey)
{
bool bKeyExists = false;
int count = m_Keys.count(strKey);
if(count > 0)
{
bKeyExists = true;
}
return bKeyExists;
}
|
durch
|
C-/C++-Quelltext
|
1
2
3
4
|
bool section::key_exists (const string_type& key) const
{
return (data_.count (key) > 0);
}
|
9/ CSection::AddKey ist nonsens, da du keine Schlüssel hinzufügst, sondern Schlüssel:Wert-Paare. Logisch wäre hier:
|
C-/C++-Quelltext
|
1
|
void section::add_value (const string_type& key, const string_type& value = _T (""));
|
10/
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
void CSection::RemoveKey(pair<string, string> pair)
{
bool bKeyExists = KeyExists(pair.first);
if(bKeyExists == false)
{
return;
}
map<string, string>::iterator it = m_Keys.find(pair.first);
m_Keys.erase(it);
return;
}
|
Was macht da unten das return??
11/ Dein ganzer Converter-Namespace ist überflüssig. Such hier im Forum mal nach "lexical_cast" oder bei google nach boost::lexical_cast.
12/ In vielen Klassen gibst du als Seperator den Datentyp "char" an. Nimm "string_type", das erleichtert die Handhabung.
13/ Bei einigen Funktionen gibt es den Parameter "strDefaultValue" (unschöne Schreibweise - but anyway), dieser hat jedoch gar keinen "default-value", dazu ist er nicht const und keine referenz.
So ich hab mir nicht alles durchgesehen, doch ich empfehle dir: Überarbeite den Code, er ist sehr wirr und unleserlich und vorallem: KOMMENTIER IHN!
so long!
- unsigned long