C ++在类中声明一个静态对象

时间:2015-04-10 01:49:19

标签: c++ class object static member

我试图声明我在不同的B类中写的A类的静态对象,如下所示:

class A // just an example
{
    int x;
public:
    A(){ x = 4; }
    int getX() { return x; }
};

class B
{
    static A obj1;  // <- Problem happens here
public:
    static void start();
};

int main()
{
    B::start();
}

void B::start()
{
    int x = obj1.getX();
}

我想要达到的目标是让int x中的B::start()int x(4)中等于class A

我在过去的一小时里尝试使用谷歌搜索所有这些,我所理解的是C ++不允许静态对象&#39;声明。这是对的吗?

如果是这样,请问我的问题。我怎样才能得到相同的结果?我有哪些可用的解决方法?请记住,我的其余代码依赖于B类中的函数是静态的。

错误

  

错误LNK2001:未解析的外部符号&#34;私有:静态类A B :: obj1&#34;

谢谢!

2 个答案:

答案 0 :(得分:3)

正如thinkerou所说,你需要包含变量的声明:

A B::obj1;

对于普通的非静态成员变量,您不需要此步骤,因为变量是作为构造函数的一部分在幕后声明的。然后将这些变量绑定到刚刚构造的类的实例。但是静态变量并不依赖于类的任何实例;它们由类的所有实例共享。因此,构造者无法正确处理它们。

C ++通过手动声明(并可选地初始化)任何静态成员变量来解决这个问题。根据声明它们的位置,它们通常在main()函数启动之前构建,因此它们可以立即使用。

答案 1 :(得分:2)

您应该初始化static var,代码:

class A // just an example
{
    int x;
public:
    A(){ x = 4; }
    int getX() { return x; }
};

class B
{
    static A obj1;  // <- Problem happens here
public:
    static void start();
};

A B::obj1; // init static var

int main()
{
    B::start();
}

void B::start()
{
    int x = obj1.getX();
}