如何访问类的静态成员?

时间:2010-11-05 09:04:06

标签: c++ static

我开始学习C ++和Qt,但有时我从书中粘贴的最简单的代码会导致错误。

我正在使用QtCreator IDE在Ubuntu 10.04上使用g++4.4.2。 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;
}

我认为它与宣布的herehere完全相同(不是吗?)。那么上面的代码有什么问题呢?

8 个答案:

答案 0 :(得分:40)

你已经宣布静态成员很好,但在任何地方都没有defined

基本上你所说的“存在一些静态成员”,但从不为它留出一些记忆,你需要:

int A::x = 100;

在课堂外的某个地方,不在里面。

答案 1 :(得分:8)

第[9.4.2]节

静态数据成员

  

静态数据成员在其类定义中的声明不是定义,除了cv-qualified void之外可能是不完整的类型。 静态数据成员的定义应出现在包含成员类定义的命名空间范围内。在命名空间范围的定义中,静态数据成员的名称应使用::运算符通过其类名进行限定

答案 2 :(得分:7)

尝试:

#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 :(得分:3)

试试这个例子:

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

答案 4 :(得分:2)

静态成员变量的定义必须存在于文件范围内,即在所有函数之外等等。

答案 5 :(得分:1)

现在您已经研究了如何使用静态类成员我会建议您通常只在以下情况下使用它们:

  • 用于模板。因此,在您的示例中,您可以将GetX()放在不同的类中,并在模板中使用

    template< typename T >
    int func()
    {
        return T::GetX();
    }
    
    虽然显然更加精细。但是这里你的静态函数在一个类中是有用的。

  • 函数需要访问类,即私有成员。你可以把它变成朋友,但你也可以把它变成静态的。通常是回调中的情况。

其余的时间你可以使用编译单元级别的函数和变量,这些函数和变量的优点是可以将你的成员从标题中删除(特别是如果它们是私有的)。您提供的实施细节越少越好。

答案 6 :(得分:1)

您需要在类外部定义类的静态成员变量,因为静态成员变量既需要声明也需要定义。

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

答案 7 :(得分:0)

案例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: const静态变量

对于 const 静态变量,我们可以在类或Outside类中定义一个值。

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.