C++ declaring a static object in a class

22,090

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

Solution 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.

Share:
22,090
ThunderStruct
Author by

ThunderStruct

Currently doing a PhD in AI Participated in the 2017 SensUs competition on molecular biosensors Love all forms of art (specifically music) Licensed PADI Advanced Open-Water scuba-diver with Nitrox specialty

Updated on July 13, 2022

Comments

  • ThunderStruct
    ThunderStruct almost 2 years

    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!