c++ - экземпляр - тестирование статических методов c#




Как создать статический класс в C++? (8)

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

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

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


Если вы ищете способ применения «статического» ключевого слова к классу, например, на C #, например

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

Если вы просто пишете обычный класс без каких-либо методов / переменных экземпляра, это одно и то же, и это то, что вы сделали бы на C ++


В C ++ вы хотите создать статическую функцию класса (а не статический класс).

class BitParser {
public:
  ...
  static ... getBitAt(...) {
  }
};

Затем вы можете вызвать функцию, используя BitParser :: getBitAt () без создания экземпляра объекта, который, как я полагаю, является желаемым результатом.


В отличие от других управляемых языков программирования, «статический класс» не имеет смысла в C ++. Вы можете использовать статическую функцию-член.


Вы также можете создать свободную функцию в пространстве имен:

В BitParser.h

namespace BitParser
{
    bool getBitAt(int buffer, int bitIndex);
}

В BitParser.cpp

namespace BitParser
{
    bool getBitAt(int buffer, int bitIndex)
    {
        //get the bit :)
    }
}

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


Как было отмечено здесь, лучшим способом достижения этого в 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
}

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

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;
  }
};

У вас может быть статический класс на C ++, как упоминалось ранее, статический класс - это тот, у которого нет каких-либо его объектов. В C ++ это можно получить, объявив конструктор / деструктор закрытым. Конечный результат тот же.


Это похоже на способ C # сделать это в C ++

В C # file.cs вы можете иметь частный var внутри публичной функции. Когда в другом файле вы можете использовать его, вызвав пространство имен с помощью функции, как в:

MyNamespace.Function(blah);

Вот как сделать то же самое в C ++:

SharedModule.h

class TheDataToBeHidden
{
  public:
    static int _var1;
    static int _var2;
};

namespace SharedData
{
  void SetError(const char *Message, const char *Title);
  void DisplayError(void);
}

SharedModule.cpp

//Init the data (Link error if not done)
int TheDataToBeHidden::_var1 = 0;
int TheDataToBeHidden::_var2 = 0;


//Implement the namespace
namespace SharedData
{
  void SetError(const char *Message, const char *Title)
  {
    //blah using TheDataToBeHidden::_var1, etc
  }

  void DisplayError(void)
  {
    //blah
  }
}

OtherFile.h

#include "SharedModule.h"

OtherFile.cpp

//Call the functions using the hidden variables
SharedData::SetError("Hello", "World");
SharedData::DisplayError();




static