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

标签 c++

正如问题所述,我正在尝试使用同一个类的静态成员函数初始化一个静态类成员变量,但在运行时的选定时间。

是因为 GameDataLocalResource 的复制构造函数被隐式删除,因为它的字段之一没有复制赋值运算符。所以我尝试定义复制构造函数,但我在编译时仍然遇到同样的错误。

我应该如何处理这个问题。请记住我是 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 的概念,因此有两个版本。您可以从这些链接中阅读有关它们的信息:

由于你的问题涉及类(class)成员,你可以更关注后者。


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


下面是一个静态成员初始化的简单例子:

SomeClass.h

class Foo {
public:
    static int bar;
    int x;

    void someFunc();
};

这里编译类的cpp文件时Foo::bar有静态持续时间和内部链接。静态成员与 Foo 的对象没有关联,但可以通过类的 this 指针访问,例如:

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 类型的对象没有关联,我们可以从下面的示例中看到这一点。

SomeOtherClassOrFunction

{
    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;
}

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

关于c++ - 如何在运行时使用静态成员函数初始化静态成员变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56763320/

相关文章:

c++ - 成员模板的别名模板

c++ - 如何在类函数中打印二维数组

c++ - 如何在 UML 类图中表示纯虚函数?

c++ - 如何将数据推送到 C++ 中的第二个位置

c++ - 重写虚函数仅通过调用约定有什么不同意味着什么?

c# - double* 和 double** 是 blittable 类型吗? C#

c++ - 创建一个线程安全的标准映射

虚拟表上的 C++ 虚拟析构函数和类的类型信息

c++ - 如何对可变参数模板函数的异构参数包进行通用计算?

c++ - netbeans IDE、测试和调试测试中的 c++ 项目中构建/清理和构建之间的区别