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

C++ declaring a static object in a class

本文关键字:一个 静态 对象 声明 C++      更新时间:2023-10-16

我试图声明一个类a的静态对象,该对象是我在另一个类B中编写的,如下所示:

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();
}

我想要实现的是使CCD_ 2中的int x等于CCD_ 4中的int x(4)。

在过去的一个小时里,我试着在谷歌上搜索所有这些,我所理解的只是C++不允许静态对象的声明。这是正确的吗?

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

错误

错误LNK2001:未解析的外部符号"private:static class A B::obj1"

谢谢!

您应该初始化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();
}

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

A B::obj1;

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

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