多个 类 需要访问静态变量

Multiple classes need access to a static variable

我们有 classes A、B 和 C,它们都需要访问 class D 中的静态变量 staticVariable

此外,class A 需要有一个 classes B 和 C 的实例,如下所示:

    class A{
    public:
    B instanceB;
    C instanceC;
    };

Class D 保存对象类型的静态变量T:

    class D{
    public:
    D() {
    staticVariable.init();
    };
    static T staticVariable;
    };

示例中classes B和C可以为空占位符classes:

    class B{
    };

    class C{
    };

main函数创建了A的一个实例:

    int main(){
    A a;
    /*...*/
    }

同样,classA、B 和 C 需要访问 staticVariable。我尝试了多种方法,包括继承和友元函数,但我总是遇到依赖问题或链接器错误,我不太明白:

    Error   LNK2001 unresolved external symbol "public: static class T 
    D::staticVariable" (?window@D@@2VT@sf@@A)   SortingAlgorithms    
    C:\Users\Dusan\source\repos\SortingAlgorithms\SortingAlgorithms\B.obj       

在 classes A、B 和 C 的 .obj 文件中报告。

我不确定 main 中是否需要 D 的实例。
我如何实现这个无错误?
对于调用初始化函数的 static 个对象,你是如何做到的?
我的意思是,如果该函数与您要初始化的对象相同 class,并且是非静态的,我似乎无法调用 staticVariable.init();

// in D.hpp
class D {
public:
  D() { ... }; // staticVariable is static, so the ctor has no business initializing it
  void init();  

  static int staticVariable;
  static D staticD;
};

// in D.cpp
#include "D.hpp"

int D::staticVariable = 10;
// Immediatly invoked initializing lambda expression
D D::staticD = []{ D tmp; tmp.init(); return tmp; }();

I'm not sure if I need an instance of D in main.

你不知道。 static 变量是全局变量,它们由同一 class 的所有实例共享,您无需实例化 class 即可使用此类变量,因此必须对其进行初始化不管 class 实例化。既然如此,它们需要在 class.

之外进行初始化

How do I implement this error-free?

类似于:

class B{};

class C{};

class A{
public:
    B instanceB;
    C instanceC;
};

class D{
public:
    D(){};
    static int staticVariable;
};

int D::staticVariable = 10; //<-- here, outside the class

int main()
{
    //no instance of D needed
    std::cout << D::staticVariable; // prints 10
    D::staticVariable++;
    std::cout << D::staticVariable; // prints 11 
}

And how do you do it for static objects that call a function for initialization?
I meant if the function is of the same class as the object you're trying to initialize, and is non-static, I can't seem to be able to call staticVariable.init();

也是一样的道理,你在class里面声明对象静态,在外面初始化:

class A{
public:
    void init(){std::cout << "Do Something";} //non-static method
};

class D{
public:
    static A obj; //declare
};

A D::obj{};  //<-- initialize outside the class

int main()
{
    D::obj.init();  // prints 'Do Something'
}