Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » c++ Best Practice

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
15.03.2010, 18:00 Uhr
saschaappel



Hallo

Ich frage mich schon lange was den das beste ist als funktion rückgabewert bei Klassenmethoden? -> Pointer oder Referencen, dazu ein Beispiel:

class Test {

1:
const std::string& getStr() { return str; }

2:
std::string& getStr() { return str; }

3:
std::string* getStr() { return *str; }

private:
std:string m_str;

}

Welche der 3 funktionen ist am bestten oder was ist best practice?

Vielen Dank

Gruss
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
15.03.2010, 18:23 Uhr
0xdeadbeef
Gott
(Operator)


Üblich ist in den meisten Fällen etwa

C++:
class person {
public:
  std::string const &name() const; // get
  void name(std::string const &);  // set

private:
  std::string name_;
};

// ...

std::string const &person::name() const {
  return name_;
}

void person::name(std::string const &name) {
  name_ = name;
}


Nomenklaturen können variieren, und bei Basistypen (int, long, etc.) kann man auf die Referenz auch verzichten (häufig macht es aber Sinn, das const trotzdem zu behalten). Wichtig ist dabei, nur Objekte als Referenz zurückzugeben, die nach Ende der Methode noch existieren - also keine lokalen Variablen. Einen Zeiger zurückzugeben macht in diesem Zusammenhang keinen Sinn.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 15.03.2010 um 18:23 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
16.03.2010, 17:37 Uhr
~saschaappel
Gast


Hi Thanks

Jo aber wenn ich folgendes mache bekomme ich einen error:

passing `const hxItsCatInfString' as `this' argument of `const std::string& hxItsCatInfString::GetITSParam()' discards qualifiers


C++:
class hxItsCatInfString  {

inline const std::string& GetCompSub() const {
        return  m_StrCompSub;
    };
    void SetCompSub(const std::string& str) {
        m_StrCompSub = str;
    };
  
private:
   std::string m_StrCompSub;
};


class  hxItsCatInfChild {

const hxItsCatInfString& GetCatName() const {
        return  m_CatInfDef;
};

private:
hxItsCatInfString      m_CatInfDef;

};




Wenn ich nun folgendes mache gehts nicht mehr:

int main() {
hxItsCatInfChild test;
std::string paramId = test.GetCatName().GetITSParam();
}

Warum? was daran ist schlecht oder wo würdest du jetzt hier mit pointers arbeiten und wo mot const ref und wo nur mit ref????
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
16.03.2010, 20:23 Uhr
0xdeadbeef
Gott
(Operator)


Deklarier GetITSParam() const. Deklarier generell alle Methoden, die ihr Objekt nicht verändern, const, sonst läufst du nämlich in genau diese Fehler.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
16.03.2010, 23:12 Uhr
~saschaappel
Gast


Ahhh ok, thanks

Apropo, ist das ein guter Programierstiel in c++, so extrem mit Referencen und const zu Arbeiten oder könnte man und sollte man solche Sachen ganz einfach mit Pointer rückgaben machen?

Weist du einen link zu einer dokumentation, wenn und wie man classenmethoden rückgaben wie machen sollte, so ein best practice halt :-)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
16.03.2010, 23:16 Uhr
~saschaappel
Gast


Shit sorry

habe das gleiche problem mit:


C++:
int main() {
hxItsCatInfChild test;
std::string paramId = test.GetCatName().GetCompSub();
}



und da ist ja alles was geht const decklariert, bekomme aber genau die gleiche fehlermeldung :-(
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
16.03.2010, 23:21 Uhr
0xdeadbeef
Gott
(Operator)


Viel mit Referenzen zu arbeiten, ist in C++ durchaus üblich. Zeiger dagegen meidet man wie die Pest, wenn es auch anders geht - Zeiger können NULL sein oder ins Nirvana zeigen, Referenzen bedeuten ein Versprechen, dass man auch ein Objekt hat.

Jetzt können Referenzen, wenn man damit Schindluder treibt, natürlich auch ins Nirvana zeigen, aber es geht hier eher um gute Kapselung - wenn ich von einem Objekt eine Referenz zurückkriege, kann ich davon ausgehen, dass ich auch ein Objekt habe - der Designer der ursprünglichen Klasse hat es so angelegt. Wenn ich dagegen einen Zeiger kriege, muss ich damit rechnen, dass der auch mal NULL ist, und das verkompliziert den umgebenden Code ungemein.

Insgesamt lässt sich das Thema nicht in einem Forum oder einem Tutorial abhandeln - ich wäre mit C++-Tutorials sowieso sehr vorsichtig, in aller Regel werden die von Leuten geschrieben, die C++ nicht gut genug kennen, um zu wissen, dass es zu komplex ist, um es in einem Tutorial abzuhandeln. Ich kann dir aber ein sehr gutes Buch nennen, das de facto ein Standardwerk für gute Programmierpraxis in C++ ist: Effective C++.

Wenn du damit durch bist, sind die Nachfolgewerke "More Effective C++" und "Effective STL" auch zu empfehlen, allerdings solltest du für "More Effective C++" wahrscheinlich erst etwas mehr Erfahrung sammeln. "Effective STL" behandelt die Standardbibliothek, in der es sehr gut ist, sich auszukennen, ich kann es dir also nur wärmstens ans Herz legen. Allerdings ist es (noch?) nicht aktualisiert worden, seit die TR1-Erweiterung verfügbar ist, also könnte es Sinn machen, auf eine neue Auflage zu warten.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra

Dieser Post wurde am 16.03.2010 um 23:23 Uhr von 0xdeadbeef editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
17.03.2010, 14:25 Uhr
~saschaappel
Gast


Ho, Ok vielen dank erst mal, wie du gemerkt hast komme ich von Java und das ist halt eine Programmiersprache für Dummies wie mich :-)

Werde mir das Buch mal zu gemüte führen...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: