如何在运行时使用静态成员函数初始化静态成员变量

How to initialize a static member variable using a static member function at runtime?

本文关键字:静态成员 函数 初始化 变量 运行时      更新时间:2023-10-16

当问题指出,我试图使用同一类的静态成员函数使静态类成员变量捕获静态类成员变量,但在运行时选择的时间。

是,GameDalocalResource的复制构造函数被隐式删除,因为其一个字段之一没有复制分配运算符。因此,我尝试定义复制构造函数,但在编译时仍会遇到相同的错误。

我应该如何处理这个问题。请记住,我是C 的初学者。

我看了许多线程如何在运行时初始化静态成员变量,但似乎不符合我的情况。

//*.h file
class GameDataResource
{
private:
    static GameDataLocalResource local_resource;
public:
    static void initializeLocalResource();
    static GameDataLocalResource  getLocalResource();
}
//*.cpp file
void GameDataResource::initializeLocalResources()
{
    GameDataResource::local_resource = GameDataLocalResource();
}
GameDataLocalResource GameDataResource::getLocalResources()
{
    return GameDataResource::local_resource;
}
//main.cpp
int main(int argc, char *argv[])
{
...
    GameDataResource::initializeLocalResources();
    qDebug() << GameDataResource::getLocalResources().getLoadingPercentage();
...
}

我希望获得加载百分比的价值,但我得到:

复制" gamedatalocalresource"的分配操作员被隐式删除,因为字段'****'没有复制分配操作员

您好,欢迎使用C++和Stackoverflow。由于您是新手,并试图理解某些内容是static的概念,因此有两个版本。您可以从这些链接中阅读有关它们的信息:

  • 存储类规范:cppReference:存储持续时间
  • 静态类成员:cppReference:静态成员

由于您的问题涉及班级成员,因此您可以更多地关注以后。


static-members如何工作?它们不属于对象,在遇到定义之前,它们可能被认为是不完整的。类成员的static关键字只能在声明期间使用。必须在类外部定义类static-member的初始化。


这是静态成员初始化的简单示例:

someclass.h

class Foo {
public:
    static int bar;
    int x;
    void someFunc();
};

在此处,当班级的CPP文件编译时,Foo::bar具有静态持续时间和内部链接。静态成员与Foo的对象没有关联

someclass.cpp

int Foo::bar = 0;
void Foo::someFunc() {
    this->x = 5; // okay
    this->bar = 9; // okay as an instance of this object can access `bar` 
                   // since all instances share this static member
                   // there is only ever one instance of `Foo::bar` in memory
}

表明它与实际实例或类型FOO的对象没有关联,我们可以从下面的示例中看到。

一些hotherclassorfunction

{
    Foo f;
    f.a = 5; // okay as long as `a` is public
    f.bar = 9; // same as above `bar` is shared across all instances of Foo
    // Accessing bar we do not need an object we can do it as such:
    std::cout << Foo::bar << 'n'; // Should print 9.
}

现在您对static成员变量静态函数有了一般的了解,遵循类似的规则,除了控制如何将其地址存储在指针中的规则,但这超出了该主题的范围。唯一的主要区别是static member functions可以通过this-pointer访问,但与该对象无关,因为它们是静态功能。


我们可以以上述示例并删除非静态成员并更改其成员函数的存储类并重命名。

foo.h

#pragma once
class Foo {
public:
    static int bar;
    static void update(int val) { bar = val; }
};

foo.cpp

#include "Foo.h"
int Foo::bar = 0; // default initialized

main.cpp

#include <iostream>
#include "Foo.h:"
int main() {
    std::cout << "Default Foo::bar = " << Foo::bar << 'n';
    Foo::update(25);
    std::cout << "Updated Foo::bar = " << Foo::bar << 'n';
    return 0;
}

我不确定这是否是您要寻找的确切行为,但这是静态类成员的基本或一般概念和用法。希望这会给您一些见识。

gamedatalocalresource是一种类型,而不是可以初始化静态变量的函数。可以解决您的问题。

,因此我发现的解决方案是在删除的答案中暗示的。主要是我在GamedAtalocalResource中添加了一个新的成员功能,该功能初始化了其"重"成员。

这样做,我可以在不加载文件的情况下进行实例。

然后调用GameAtaresource的静态成员函数触发GameDatalocalResource实例将文件加载到其成员变量中。

谢谢大家!