C++ declaring a static object in a class

2019-03-02 04:40发布

问题:

I'm trying to declare a static object of a class A that I wrote in a different class B, like this:

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

What I want to achieve is to get int x in B::start() to equal int x in class A (4).

I tried googling all this for the past hour and all I understood was that C++ doesn't allow static objects' declarations. Is that correct?

If so, here's my question. How can I get the same result? What are my available workarounds? Keeping in mind that the rest of my code depends on the functions in class B to be static.

Error

error LNK2001: unresolved external symbol "private: static class A B::obj1"

Thanks!

回答1:

You should initialize static var, the code:

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


回答2:

As thinkerou said, you need to include the declaration of the variable:

A B::obj1;

For normal, non-static member variables you don't need this step because the variables are declared behind the scenes as part of the constructor. These variables are then tied to the instance of the class you just constructed. But static variables are not tied to any instance of a class; they are shared by all instances of a class. So constructors can't properly deal with them.

C++ gets around this by making you manually declare (and optionally initialize) any static member variables. Depending on where they are declared, they typically get constructed before your main() function starts, so they are available for use immediately.