2016-04-05 7 views
0

ich cpp lerne. Ich dachte, dass Memebertyp Funktionen/Variable sind, die zu einem Typ gehören. Für exanple in dem folgendencpp <chrono> - Mitglied Typ defenition

class person 
{ 
public: 
    string name; 
    int age; 
}; 

Namen und Alter ist Mitglied Typ (in diesem Fall Mitglied Klasse) der Person Klasse.

Kürzlich begann ich, über <chrono> Bibliothek zu lesen, und Thaen ich verwirrt gestartet. Es gibt zum Beispiel class system_clock, die time_point Elementtyp hat. Auf der anderen Seite gibt es aber auch die Klasse time_point, die den Taktgliedtyp (z. B. Klasse system_clock) hat.

Wie kann eine Klasse sompe Typ als Elementtyp enthält und auch ein Mitglied Typ ihres Mitglieds-Typ sein.

Ich hoffe, dass es mir gelungen meine Verwirrung zu erklären.

+0

Das Implementieren von '' (oder sogar das Verstehen der Implementierung) ist ein sehr ehrgeiziges Projekt für Anfänger. :-) –

+0

@ Howard Hinnant- Ich muss ... es ist ein Teil eines Codes in Arbeit: -0 – sara8

Antwort

1

Sie verwirren nicht statische Datenelemente mit verschachtelte Elementtyp Aliase.

Beispiele für nicht-statisches Datenelement sind name und age in:

class person 
{ 
public: 
    string name; 
    int age; 
}; 

nameage und Speichern von Werten innerhalb einer spezifischen Instanz von person. Sie haben eine Adresse in einer L-Wert-Instanz von person so können Sie herausfinden, was die Adresse ist:

person p; 
string* np = &p.name; // this is where p.name lives in memory 

A verschachtelter Typ alias nicht Speicher einnehmen. Zum Beispiel:

class person 
{ 
public: 
    using name_type = string; 
    string name; 
    int age; 
}; 

person::name_type ist eine Art Alias ​​für string. Es belegt keinen Speicherplatz. Man könnte es ein string zu erstellen verwenden:

person::name_type x = string{}; 

system_clock::time_point ist eine Art Alias ​​für:

time_point<system_clock, system_clock::duration> 

time_point::clock ist eine Art Alias ​​für Clock in:

time_point<Clock, ...> 

So time_point<system_clock, system_clock::duration>::clock ist der gleiche Typ wie system_clock.

system_clock speichern keine time_pont. Tatsächlich speichert es überhaupt nichts (keine nicht statischen Datenmitglieder).

time_point keinen Takt als ein nicht-statisches Datenelement.time_point speichert nur ein duration die die Art der time_point ‚s zweiter Template-Parameter in hat:

template <class Clock, class Duration = typename Clock::duration> 
class time_point; 

wie diese verwendet werden, um diese Art Aliase könnte:

system_clock::time_point tp = system_clock::now(); 

Obwohl die Verwendung von auto hier viel einfacher ist, (und meine Vorliebe):

auto tp = system_clock::now(); 

Verwendung von time_point::clock könnte nützlich sein, wenn Sie ag hatte ENERIC time_point und man brauchte now() auch immer Uhr anrufen, dass time_point mit gemessen wird:

template <class TimePoint> 
void some_function(TimePoint tp) 
{ 
    using Clock = typename TimePoint::clock; 
    auto now = Clock::now(); 
    ... 

dieser letzteren Anwendungsfall ist selten, aber die Fähigkeit ist es, wenn Sie es brauchen.

Wenn Sie etwas über <chrono> lernen, tun die meisten Leute es besser, indem Sie tutorialähnliche Informationen darüber lesen oder Beispielcode betrachten oder andere Stack Overflow-Fragen dazu lesen. Wenn Menschen versuchen, etwas über <chrono> zu lernen, indem sie ihre Implementierung untersuchen, haben sie immer eine stark negative Reaktion auf ihre relativ komplexe Implementierung.

Seine Implementierung ist relativ komplex, weil es viel leistungsfähiger als Alternativen wie timespec ist. Sein alltäglicher Gebrauch hat jedoch eine sehr einfache und sichere Syntax. Für allgemeine Anwendungsfälle müssen Sie nicht einmal wissen, dass alles auf Vorlagen basiert. Sie können einfach Dinge wie system_clock::now(), nanoseconds und hours verwenden.

Ich empfehle einige der [chrono]-tagged Fragen zu lesen. Ich empfehle auch Teile des <chrono> Vorschlag hier lesen:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2661.htm

Der Ausschuss selbst zu diesem Thema ein Tutorial benötigt, und dieses Papier enthält eine ziemlich gute. Überspringen Sie die Teile, die vorgeschlagene Formulierungen enthalten, es sei denn, Sie benötigen eine Schlafhilfe. Das Papier ist etwas altmodisch, da einige Details sich geändert haben, aber nicht viele. Ein Beispiel ist, dass monotonic_clock seitdem in steady_clock umbenannt wurde. Ein weiteres Detail ist, dass constexpr seither großzügig angewendet wurde. Seither wurden den 6 konkreten Durationstypen benutzerdefinierte Literale hinzugefügt.

Schließlich hat Nicolai M. Josuttis' second edition of The C++ Standard Library - A Tutorial and Reference einen schönen Abschnitt auf <chrono>.

Verwandte Themen