如何在运行时使用静态成员函数初始化静态成员变量
How to initialize a static member variable using a static member function at runtime?
当问题指出,我试图使用同一类的静态成员函数使静态类成员变量捕获静态类成员变量,但在运行时选择的时间。
是,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实例将文件加载到其成员变量中。
谢谢大家!
- 如何在C++中使用非静态成员函数作为回调函数
- 静态成员函数使用相同的名称时出现模板类型名称错误
- 在 nullptr 上调用无状态类的非静态成员函数是否合法?
- 为什么传递非静态成员函数会导致编译错误?
- 处理类内的回调时,必须调用对非静态成员函数的引用
- 非静态成员函数的 decltype 格式不正确吗?
- std::异步与非静态成员函数
- C++无效使用非静态成员函数?
- 未使用的C++未优化的静态成员函数/变量
- C++:如何返回指向非静态成员函数的指针?
- 使用静态成员函数而不是普通函数是否有任何开销?
- 在 stream_descriptor::async_wait 中无效使用非静态成员函数
- 为什么我不能像这样在静态成员函数中调用静态成员变量?
- 无法在clang Linux中分配非静态成员函数,但我可以在Visual Studio Windows中分配
- 在类定义中推导内联静态成员函数的返回类型
- `enable_if()`以禁用模板化类的静态成员函数声明
- 错误:无效使用非静态成员函数"int test::hotplug_callback(libusb_contex
- 常量静态成员函数
- 使用 vector.sort() 的非静态成员函数无效使用
- 从静态成员函数访问私有非静态类变量 - C++