[C++] Echte private Methoden und Implementierungen

Hier können Artikel, Tutorials, Bücherrezensionen, Dokumente aller Art, Texturen, Sprites, Sounds, Musik und Modelle zur Verfügung gestellt bzw. verlinkt werden.
Forumsregeln
Möglichst sinnvolle Präfixe oder die Themensymbole nutzen.
starvald
Beiträge: 31
Registriert: 16.04.2010, 17:20
Wohnort: Heppenheim

Re: [C++] Echte private Methoden und Implementierungen

Beitrag von starvald »

CodingCat hat geschrieben: Leider gibt es Fälle, in denen die Einzelübergabe privater Attribute an private Funktionen alleine aufgrund der großen Attributanzahl äußerst mühsam und damit unpraktikabel wird. In diesem Fall kann auf eine verschachtelte Attributstruktur zurückgegriffen werden, deren Typ öffentlich zugänglich, die Instanz selbst jedoch privat ist:

Code: Alles auswählen

// header (*.h)
class foo
{
public:
   foo(...);

   // public methods
   void publicMethod();

   struct M
   {
      // attributes
      int sth;
      int sthElse;

      M(...);
   };

private:
   M m;
};

// implementation (*.cpp)
foo::M::M(...)
   : sth(0),
   sthElse(1)
{
   // consistent member access
   M &m = *this;
   m.sth = ...;
   // ...
}

foo::foo(...)
   : m(...)
{
}

// private methods
void privateMethod(foo::M &m)
{
    m.sth = ...;
}

// public methods
void foo::publicMethod()
{
    privateMethod(m);
    m.sthElse = ...;
}
Hallo,

ich habe eine Frage zu diesem Ansatz: Welchen Grund gibt es, dass die Member-Struct öffentlich zugänglich ist? Warum nicht protected oder private?

Gruß,
Starvald
Benutzeravatar
CodingCat
Establishment
Beiträge: 1857
Registriert: 02.03.2009, 21:25
Wohnort: Student @ KIT
Kontaktdaten:

Re: [C++] Echte private Methoden und Implementierungen

Beitrag von CodingCat »

Damit sich private Methoden "tatsächlich privat", also rein modulintern, als freie Funktionen definieren lassen (siehe void privateMethod(foo::M &m)). Alles andere würde die Deklaration dieser freien Funktionen als friends im Header erfordern, womit jeglicher Vorteil zunichte wäre, denn dann ließen sich mit weniger Umstand auch einfach direkt private Methoden verwenden.

Im Übrigen schadet das wenig, denn das Attribut selbst ist wieder private. Die Klasse hat es also nach wie vor selbst in der Hand, an wen sie die Interna rausgibt.
alphanew.net (last updated 2011-07-02) | auf Twitter | Source Code: breeze 2 | lean C++ library | D3D Effects Lite
starvald
Beiträge: 31
Registriert: 16.04.2010, 17:20
Wohnort: Heppenheim

Re: [C++] Echte private Methoden und Implementierungen

Beitrag von starvald »

CodingCat hat geschrieben:Damit sich private Methoden "tatsächlich privat", also rein modulintern, als freie Funktionen definieren lassen (siehe void privateMethod(foo::M &m)). Alles andere würde die Deklaration dieser freien Funktionen als friends im Header erfordern, womit jeglicher Vorteil zunichte wäre, denn dann ließen sich mit weniger Umstand auch einfach direkt private Methoden verwenden.

Im Übrigen schadet das wenig, denn das Attribut selbst ist wieder private. Die Klasse hat es also nach wie vor selbst in der Hand, an wen sie die Interna rausgibt.
Besten Dank an Dich und das beste Forum überhaupt! :-) Ich setze diesen Thread übr. gerade in einer Firma um und muss diese "unkonventionelle" Art und Weise des Programmierens rechtfertigen.
Antworten