C ++: имя класса class :: reference {...} - PullRequest
2 голосов
/ 26 октября 2011

Я изучал STL и никогда не видел такого класса, как class classname :: reference {}

Я искал в сети, но мог получить хорошую информацию ..

class bitset::reference {
  friend class bitset;
  reference();                                 // no public constructor
public:
  ~reference();
  operator bool () const;                      // convert to bool
  reference& operator= ( bool x );             // assign from bool
  reference& operator= ( const reference& x ); // assign from bit
  reference& flip();                           // flip bit value
  bool operator~() const;                      // return inverse value
};
  • что это за :: ссылка здесь?

я видел этот код здесь [введите описание ссылки здесь] [1] http://www.cplusplus.com/reference/stl/bitset/ Я работал на C ++ раньше.

Ответы [ 4 ]

2 голосов
/ 26 октября 2011

Вы смотрели на определение класса bitset?Где-то что-то вроде этого:

template<size_t _Bits>
class bitset
{
    ...
    class reference;
    ...
}

Это очень похоже на размещение тела функции вне тела класса.Теперь мы помещаем тело вложенного класса за пределы родительского класса:

class bitset::reference
{
    /* class body */
}

Кстати, в MSVC (C:\Program Files\Microsoft Visual Studio 9.0\VC\include\bitset) они фактически определены внутри друг друга:

// TEMPLATE CLASS bitset
template<size_t _Bits>
class bitset
{   // store fixed-length sequence of Boolean elements
typedef unsigned long _Ty;  // base type for a storage word
enum {digits = _Bits};  // extension: compile-time size()

public:
typedef bool element_type;  // retained

    // CLASS reference
class reference
    {   // proxy for an element
    friend class bitset<_Bits>;
    .
    .
    .

То же самое относится к bitset.h в g ++, хотя и немного сложнее.

1 голос
/ 26 октября 2011

Строка перед цитируемым вами фрагментом объясняет:

Поскольку в большинстве сред C ++ такого маленького элементного типа не существует, к отдельным элементам обращаются как к специальным ссылкам, имитирующим элементы bool

C ++ не допускает ссылки на битовые поля, поэтому для имитации используется класс reference.

1 голос
/ 26 октября 2011

Это вложенный класс .Из статьи:

Класс может быть объявлен в рамках другого класса.Такой класс называется «вложенным классом».Вложенные классы считаются находящимися в области действия включающего класса и доступны для использования в этой области.Чтобы сослаться на вложенный класс из области, отличной от его непосредственно включающей области, вы должны использовать полностью определенное имя.

Альтернативная интерпретация заключается в том, что класс bitset используется не только каккласс, но и как пространство имен.

1 голос
/ 26 октября 2011

ссылка на имя класса, ничего особенного. bitset :: reference означает, что ссылка является внутренним классом.

...