Как получить доступ к статическим членам класса? - PullRequest
22 голосов
/ 05 ноября 2010

Я начинаю изучать C ++ и Qt, но иногда самый простой код, который я вставляю из книги, приводит к ошибкам.

Я использую g++4.4.2 в Ubuntu 10.04 с IDE QtCreator. Есть ли разница между синтаксисом компилятора g ++ и другими компиляторами? Например, когда я пытаюсь получить доступ к статическим членам, что-то всегда идет не так.

#include <iostream>
using namespace std;
class A
{
   public:
      static int x;
      static int getX() {return x;}
};
int main()
{
   int A::x = 100; // error: invalid use of qualified-name 'A::x'
   cout<<A::getX(); // error: : undefined reference to 'A::x'
   return 0;
}

Я думаю, это точно так же, как объявлено здесь и здесь (не так ли?) Так что не так с приведенным выше кодом?

Ответы [ 8 ]

40 голосов
/ 05 ноября 2010

Вы объявили статические члены в порядке, но не определили их где-либо.

В основном то, что вы сказали "существует некоторый статический член", но никогда не откладывайте часть памятидля этого вам нужно:

int A::x = 100;

Где-то вне класса и не внутри main.

8 голосов
/ 05 ноября 2010

Раздел [9.4.2]

Статические данные членов

Объявление статического члена данных в определении класса не является определением и может иметь неполный тип, отличный от cv-квалифицированного void. Определение статического члена данных должно появляться в области имен, включающей определение класса члена . В определении в области пространства имен имя члена статических данных должно быть квалифицировано по имени его класса с использованием оператора ::

7 голосов
/ 05 ноября 2010

Попробуйте:

#include <iostream>
using namespace std;
class A
{
   public:
      // This declares it.
      static int x;
      static int getX(){return x;}
};

// Now you need an create the object so
// This must be done in once source file (at file scope level)
int A::x = 100;


int main()
{
   A::x = 200;
   // Note no int here. You can modify it

   cout<<A::getX(); // Should work
   return 0;
}
3 голосов
/ 21 апреля 2015

Попробуйте этот пример:

#include<iostream>
using namespace std;

class check
{
        static int a;
    public:
        void change();
} ;
int check::a=10;
void check::change()
{
    a++;
    cout<<a<<"\n";
}

int main()
{

    int i,j;
    check c;
    check b;
    c.change();
    b.change();
    return 0;
}
2 голосов
/ 29 июня 2018

Необходимо определить статическую переменную-член класса вне класса, поскольку статические переменные-члены требуют объявления, а также определения.

#include <iostream>
using namespace std;
class A
{
   public:
      static int x;
      static int getX() {return x;}
};

int A::x;         // STATIC MEMBER VARIABLE x DEFINITION

int main()
{
   A::x = 100;    // REMOVE int FROM HERE
   cout<<A::getX();
   return 0;
}
2 голосов
/ 05 ноября 2010

Определение статических переменных-членов должно находиться в области видимости файла, то есть вне всех функций и т. Д.

1 голос
/ 05 ноября 2010

Теперь вы разобрались с тем, как использовать статические члены класса. Я посоветую вам, как правило, использовать их только в следующих случаях:

  • Для использования в шаблонах. Таким образом, в вашем примере вы можете использовать GetX () в разных классах и в шаблоне, где бы вы использовали

    template< typename T >
    int func()
    {
        return T::GetX();
    }
    

    хотя, очевидно, более сложный. Но здесь ваша статическая функция, находящаяся в классе, служит цели.

  • Где функция нуждается в доступе к классу, т. Е. К закрытым членам. Вы могли бы сделать это другом, но вы также можете сделать это статичным. Часто дело в обратных вызовах.

В остальное время вы, вероятно, можете использовать функции и переменные уровня модуля компиляции, что имеет преимущество, заключающееся в том, что вы убираете ваши члены из заголовка (особенно, если они закрытые). Чем меньше деталей реализации вы дадите, тем лучше.

0 голосов
/ 01 августа 2017

Случай 1: статическая переменная

Как мы все знаем, определение статической переменной внутри класса, которая вызовет ошибку компиляции.Например:

class Stats
{
  public: 
     static int AtkStats[3];
     *static int a =20;*        // Error: defining a value for static variable
};

int Stats::AtkStats[3] =  {10, 0, 0};

Выход:

error: ISO C++ forbids in-class initialization of non-const static member 'Stats::a'

Случай 2: постоянная статическая переменная

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

class Stats
{
  public: 
     static const int AtkStats[3];
     static const int a =20;        // Success: defining a value for a const static
};

const int Stats::AtkStats[3] =  {10, 0, 0};

const int Stats::a = 20;        // we can define outside also

Вывод:

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