Статические члены класса данных и конструкторы - PullRequest
3 голосов
/ 08 июня 2010

Как получить доступ к статическому члену в классе со всеми статическими методами?

Я хочу иметь группу связанных функций, но также иметь некоторые важные элементы данных, инициализированные до вызова любой из этих функций. Я думал, что урок будет только со статическими членами. Компилятор в VS2008 не любит, когда я пытаюсь получить доступ к "а".

Конечно, мне не хватает чего-то маленького, но все еще очень запутанного. :П (Даже без недопустимого доступа «a» конструктор не вызывается при вызове testMethod () из main.

class IPAddressResolver
{
private:

public:
    static int a;
    IPAddressResolver();
    static void TestMethod();
};


IPAddressResolver::IPAddressResolver()
{
    IPAddressResolver::a = 0;
    cout << "Creating IPAddressResolver" << endl;
}

void IPAddressResolver::TestMethod()
{
    cout << "testMethod" << endl;
}

Ответы [ 3 ]

11 голосов
/ 08 июня 2010

Вам необходимо определить член статических данных вне функции, например

class IPAddressResolver
{
private:
    static int a;
    IPAddressResolver();
public:
    static void TestMethod();
};

int IPAddressResolver::a = 0;

void IPAddressResolver::TestMethod()
{
    cout << "testMethod" << endl;
}

Ваш конструктор не вызывается, поскольку вы не создаете новый экземпляр класса.Для статического служебного класса вам не нужны экземпляры, поэтому вы можете вообще опустить конструктор.В качестве альтернативы вы можете объявить его private, чтобы явно указать, что экземпляр класса не должен быть создан (см. Выше).

Примечания:

  • его не рекомендуется использоватьpublic полей в классах, поэтому я превратил a в private,
  • статические служебные классы, как правило, не сохраняют состояния, поэтому если вам нужно иметь поля внутри вашего класса, это может быть признаком того, что класслучше быть синглтоном .
2 голосов
/ 08 июня 2010

Я хочу иметь группу связанных функций, но также иметь некоторые важные элементы данных, инициализированные до вызова любой из этих функций

Звучит так, будто вы хотите Singleton, а не класс с только статическими членами.

2 голосов
/ 08 июня 2010

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

Проще всего просто поместить

int IPAddressResolver::a = 0;

в ваш IPAddressResolver.cppфайл.

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