【问题标题】:Multiple classes need access to a static variable多个类需要访问一个静态变量
【发布时间】:2021-05-19 08:09:15
【问题描述】:

我们有 A、B 和 C 类,所有这些都需要访问 D 类中的静态变量 staticVariable

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

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

D类持有对象类型T的静态变量:

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

在示例中,类 B 和 C 可以是空的占位符类:

    class B{
    };

    class C{
    };

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

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

同样,A、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       

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

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

【问题讨论】:

  • 链接器错误?像这些? stackoverflow.com/questions/5019856/…
  • 请展示您失败的尝试之一。目前尚不清楚您正在努力解决什么问题。您可以通过D::staticVariable 访问它。但是,请注意,在您发布的代码中,未定义静态成员。这是否也是您真实代码中的问题,我们只能在您发布 minimal reproducible example 时知道
  • @IWonderWhatThisAPIDoes我澄清了代码,'staticVariable'在D的构造函数中初始化。
  • 您添加的行对我的评论没有任何改变。您需要定义静态变量。静态变量未在构造函数中初始化。请发布minimal reproducible example 以及由此产生的错误消息
  • @yomag1234 你不在构造函数中初始化(静态的东西就像全局的,它们没有绑定到一个对象)。你必须在类之外初始化它们(在你的实现文件中,比如Type Class::Variable = Value;

标签: c++ inheritance static linker dependencies


【解决方案1】:

我不确定我是否需要 main 中的 D 实例。

你没有。 static 变量是全局变量,它们由同一个类的所有实例共享,您不需要实例化一个类就可以使用这些变量,因此无论类实例化如何,都必须初始化它们。在这种情况下,它们需要在类之外进行初始化。

我如何才能无错误地实现这个?

类似:

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 
}

对于调用函数进行初始化的 static 对象,你如何做到这一点?
我的意思是,如果该函数与你的对象属于同一类尝试初始化,并且是非静态的,我似乎无法调用staticVariable.init();

原理一样,在类内声明对象为静态,在类外初始化:

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'
}

【讨论】:

    【解决方案2】:
    // 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; }();
    

    【讨论】:

      猜你喜欢
      • 2012-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-04
      • 2014-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多