Как вы создаете статический класс в C ++? - PullRequest
234 голосов
/ 13 августа 2008

Как вы создаете статический класс в C ++? Я должен быть в состоянии сделать что-то вроде:

cout << "bit 5 is " << BitParser::getBitAt(buffer, 5) << endl;

Предполагается, что я создал класс BitParser. Как будет выглядеть определение класса BitParser

Ответы [ 12 ]

2 голосов
/ 21 марта 2018

Как уже отмечалось, лучшим способом достижения этого в C ++ может быть использование пространств имен. Но поскольку никто не упомянул здесь ключевое слово final, я публикую пост, как будет выглядеть прямой эквивалент static class из C # в C ++ 11 или более поздней версии:

class BitParser final
{
public:
  BitParser() = delete;

  static bool GetBitAt(int buffer, int pos);
};

bool BitParser::GetBitAt(int buffer, int pos)
{
  // your code
}
0 голосов
/ 25 апреля 2018

Один случай, когда пространства имен могут быть не столь полезны для достижения «статических классов», - это использование этих классов для достижения композиции по наследованию. Пространства имен не могут быть друзьями классов и поэтому не могут получить доступ к закрытым членам класса.

class Class {
 public:
  void foo() { Static::bar(*this); }    

 private:
  int member{0};
  friend class Static;
};    

class Static {
 public:
  template <typename T>
  static void bar(T& t) {
    t.member = 1;
  }
};
...