Можно ли объявить класс статическим в c ++? - PullRequest
10 голосов
/ 28 октября 2009

Законно ли это в c ++ (да, я знаю, что оно разрешено в .net), и если да, то как / почему оно будет использоваться?

static class foo{  
    public:  
        foo();  
        int doIt(int a);   
};

Ответы [ 7 ]

27 голосов
/ 28 октября 2009

Если вы используете C ++ / CLI, фактический синтаксис для static будет

ref class Foo abstract sealed /* abstract sealed = C# static */
{
};
22 голосов
/ 28 октября 2009

Нет, это не поддерживается в C ++. Единственное, что спецификатор static делает в .NET, это заставляет вас делать все члены класса статичными; это просто вспомогательное ключевое слово. Чтобы написать статический класс на C ++, все, что вам нужно сделать, это убедиться, что каждый член в классе помечен как static. (Edit: и непубличный конструктор, поэтому ваш «статический» класс не может быть создан.)

8 голосов
/ 28 октября 2009

Ближайшим эквивалентом статического класса в C ++ является класс, содержащий только статические переменные-члены. Это известно как шаблон monostate . Такой класс означает, что все экземпляры этого класса будут иметь одинаковое состояние. Синтаксис использования экземпляра monostate подобен обычному классу (в отличие от одноэлементного класса), и действительно, класс monostate может быть преобразован в обычный класс без изменения какого-либо его использования. Э.Г.

// Monostate class
public class Administrator
{
  private:
    static int _userId;
  public
    int UserId() { return _userId; }
}

// Initializing the monostate value
int Administrator::_userId = 42;

// Using an instance of a monostate class
void Foo()
{
    Administrator admin = new Administrator();
    Assert.Equals( 42, admin.UserId() );   // will always be 42 
}
7 голосов
/ 28 октября 2009

Модификатор static в области уровня файла в C ++ указывает, что идентификатор, отмеченный static, виден только в файле, в котором он определен. Этот синтаксис недоступен в классах (только методы и переменные), но аналогичный эффект может быть получен для классов, использующих анонимное пространство имен:

namespace{
  class Foo{};
};
0 голосов
/ 06 марта 2016

Класс не может быть статическим. Для статического класса на другом языке объявите класс только со статическими членами.

static перед объявлением класса приписывает немедленно созданный объект, в основном это полезно для анонимных классов;

static class Foo {} foo;

Foo, имя класса здесь необязательно.

0 голосов
/ 28 октября 2009

Нет, static для объектов и функций.

0 голосов
/ 28 октября 2009

Как уже упоминалось в следующем потоке, C ++ не поддерживает статический класс.

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

http://www.daniweb.com/forums/thread122285.html#

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...