2012-12-04 4 views
17

In diesem question diskutiert wurde, warum eine private Art mit auto aussetzt:Einen privaten Typ mit Auto ausstellen: Wo kann es nützlich sein?

#include <iostream> 

using namespace std; 

class Base { 

    class PrivateClass {  
    public: 
    void bar() { cout << "PrivateClass" << endl; } 
    }; 

public: 

    PrivateClass foo() { 
    PrivateClass a; 
    return a; 
    } 

}; 

int main() { 

    Base b; 
    auto p = b.foo(); 
    p.bar(); 
    return 0; 
} 

ist völlig in Ordnung, durch den Standard 11 C++. Was ich immer noch nicht verstehe ist, wie dieses Idiom in einer realen Anwendung nützlich sein könnte. Gibt es Probleme, bei denen dieses Idiom effektiv verwendet werden kann, oder es sollte als eine "kuriose" Nebenwirkung des Keywords betrachtet werden?

Antwort

10

Es kann nützlich sein, wenn der Rückgabetyp nicht angegeben ist. Zum Beispiel ist das zurückgegebene Objekt von einem Aufruf an std::bind oder früher boost::bind nicht angegeben. Es ist ein implementation-definierter Funktor, aber Sie können seinen Typ nicht kennen, ohne Implementierungsdetails zu betrachten. Vor dem C++ 11-Schlüsselwort auto könnten Sie boost::function als Variablentyp zum Speichern des Ergebnisses bind verwenden, oder Sie könnten das Ergebnis bind an eine Funktion übergeben, die ein Template-Argument verwendet. Mit C++ 11 können Sie das Ergebnisobjekt unter Verwendung von auto speichern.

Wenn also eine Klasse einen internen Typ hat, ist es nicht erforderlich, den tatsächlichen Typ einer öffentlichen API offen zu legen. Ein Benutzer der Klasse kann einfach das Schlüsselwort auto verwenden, und die API-Dokumentation kann sagen, dass der Typ "nicht angegeben" ist. Dies hält den tatsächlichen internen Typ ein privates Implementierungsdetail, das oft die Kapselung verbessern kann.

+3

Ich denke nicht, dass dies wirklich die Frage beantwortet. Es ist eine gute Antwort auf eine andere Frage, die lautet: "Was ist' auto'? " –

+3

Ich denke, es beantwortet die Frage. Der interne Typname kann privat gehalten werden, während der Client mit Objekten dieses Typs arbeiten kann. –

+4

@Lightness Rennen im Orbit, ich bin mir nicht sicher, warum Sie denken, dass dies die Frage nicht beantwortet. Er möchte wissen, warum jemand 'auto' verwendet, um einen privaten Typ zu speichern, der von einer Funktion zurückgegeben wird. Die Antwort liegt darin, dass auf diese Weise der private Typ in der öffentlichen API nicht angegeben werden kann. –

1

Wenn das Schlüsselwort "auto" & diese Funktion bietet, scheint das Konzept der "privaten Typen" unpraktisch.

Vor O.O.P. verstecken einige Entwickler einen Typ mit einem Zeiger (void *) in eine "Struktur". Ein weiterer aktualisierter Fall erlaubte ein Objekt einer gegebenen Klasse, das nur von einer Oberklasse exponiert wurde.