2016-04-05 4 views
0

Я изучаю cpp. Я думал, что тип memeber - это функции/переменные, принадлежащие типу. Для exanple в следующемcpp <chrono> - тип члена defenition

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

имя и возраст являются тип элемента (в данном классе члена случае) класса человека.

Недавно я начал читать о библиотеке <chrono>, и thaen я начал смущаться. Существует, например, class system_clock, который имеет тип time_point. Но, с другой стороны, есть класс time_point, который имеет тип члена Clock (например, class system_clock).

Как класс может содержать тип sompe как тип члена, а также быть типом-членом его собственного типа элемента.

Я надеюсь, что мне удалось объяснить свое замешательство.

+0

Реализация '' (или даже понимание его реализации) - очень амбициозный проект для новичка. :-) –

+0

@ Howard Hinnant - я должен ... это часть кода в работе: -0 – sara8

ответ

1

Вы в недоумении нестатические данные члены с вложенные псевдонимы типа члена.

Примеров нестатического элемента данных являются name и age в:

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

name и age хранения значений внутри конкретного экземпляра person. Они имеют адрес в качестве Lvalue экземпляра person так что вы можете узнать, что этот адрес:

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

вложенного типа псевдоним не занимает память. Например:

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

person::name_type представляет собой тип псевдоним для string. Он не занимает память. Вы можете использовать его, чтобы создать string:

person::name_type x = string{}; 

system_clock::time_point тип псевдоним:

time_point<system_clock, system_clock::duration> 

time_point::clock тип псевдоним для Clock в:

time_point<Clock, ...> 

Итак, time_point<system_clock, system_clock::duration>::clock является тот же тип, что и system_clock.

system_clock не хранит time_pont. В самом деле, он вообще ничего не хранит (нестатические элементы данных).

time_point не имеет часов в качестве нестатического элемента данных.time_point хранит только duration, который имеет тип второго параметра шаблона time_point «s в:

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

Эти псевдонимы типа могут быть использованы следующим образом:

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

Хотя использование auto здесь намного проще (и мои предпочтения):

auto tp = system_clock::now(); 

Использование time_point::clock может пригодиться, если у вас AG eneric time_point и вам необходимо позвонить now() для любой часы, которые time_point измеряется:

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

Этот последний потребительной случае является более редким, но возможность есть, если вам это нужно.

В общем, узнав о <chrono>, большинство людей лучше читают учебную информацию об этом или просматривают пример кода или читают другие вопросы о переполнении стека. Когда люди пытаются узнать об <chrono>, изучая его реализацию, они неизменно имеют сильную негативную реакцию на ее относительно сложную реализацию.

Его реализация относительно сложна, потому что она намного мощнее, чем альтернативы, такие как timespec. Однако его обычное повседневное использование имеет очень простой и безопасный синтаксис. Для обычных случаев вам даже не нужно знать, что все шаблоны. Вы можете просто использовать такие вещи, как system_clock::now(), nanoseconds и hours.

Я рекомендую прочитать некоторые вопросы [chrono]-tagged. Я также рекомендую прочитать части из <chrono> предложения найти здесь:

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

комитет сам по себе нужен учебник по этой теме, и этот документ содержит довольно хороший. Пропустите части, содержащие предложенную формулировку, если вы не нуждаетесь в помощи для сна. Документ несколько устарел, поскольку несколько деталей изменились, но не так много. Одним из примеров является то, что monotonic_clock с тех пор переименован в steady_clock. Еще одна деталь заключается в том, что constexpr с тех пор широко применяется. И пользовательские литералы с тех пор были добавлены к 6 конкретным типам продолжительности.

Наконец, Nicolai M. Josuttis' second edition of The C++ Standard Library - A Tutorial and Reference имеет хороший раздел на <chrono>.