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

时间:2019-06-25 23:36:46

标签: 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'的副本分配操作符被隐式删除,因为字段'****'没有副本分配操作符

3 个答案:

答案 0 :(得分:0)

GameDataLocalResource是可以初始化静态变量的类型而不是函数。也许可以解决您的问题。

答案 1 :(得分:0)

因此,我找到的解决方案在已删除的答案中得到了提示。主要是我在GameDataLOCALResource中添加了一个新的成员函数,用于初始化其“大量”成员。

这样做,我无需加载文件就可以创建它的实例。

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

谢谢大家!

答案 2 :(得分:0)

您好,欢迎来到C++和stackoverflow。由于您是新手,并且试图了解事物static的概念,因此有两个版本。您可以从以下链接中了解它们:

由于您的问题涉及班级成员,因此您可以将重点放在后面。


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

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