正如问题所述,我正在尝试使用同一个类的静态成员函数初始化一个静态类成员变量,但在运行时的选定时间。
是因为 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
的概念,因此有两个版本。您可以从这些链接中阅读有关它们的信息:
- 存储类说明符:cppreference:storage duration
- 静态类成员:cppreference:static members
由于你的问题涉及类(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/