Seite 2 von 2

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

Verfasst: 02.04.2013, 09:18
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

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

Verfasst: 02.04.2013, 10:35
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.

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

Verfasst: 02.04.2013, 11:39
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.