C++创建对象的全局引用
C++ Creating Global Reference of an Object
我正在尝试创建对象的全局引用,但它似乎失败了,或者我在Qt C++中遇到了另一个错误。
我有一个名为"System"的类,它包含许多对象作为成员。我想从任何地方访问系统的成员,包括系统的成员。这是我下面的代码:
// System.h
class System
{
public:
Obj1* m_obj1;
Obj2* m_obj2;
System();
~System();
static System* GetGlobalReference();
}
// System.cpp
static System* GlobalReference = 0;
System::System()
{
if (!GlobalReference) GlobalReference = this;
m_obj1 = new Obj1();
m_obj2 = new Obj2();
}
System* System::GetGlobalReference()
{
return GlobalReference;
}
// main.cpp
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
System* system = new System();
MainWindow window;
window.showMaximized();
return app.exec();
}
//Obj1.h
class Obj1 : public QObject
{
Q_OBJECT
public:
Obj1() : QObject() {}
~Obj1();
public slots:
void Import();
}
// Obj1.cpp
void Obj1::Import()
{
QString path = QFileDialog::getOpenFileName(
0,
QString("Import file..."),
QString("C:\"),
QString("JPEG File (*.jpg)"),
0,
0);
if (System::GetGlobalReference())
System::GetGlobalReference()->m_obj2->Import(path); // error here
else
// System::GlobalReference is null
}
似乎引用不为空,但我在运行时收到错误"访问冲突读取位置..."怎么了?
顺便说一句,Obj1 是一个 QObject 和导入方法是一个公共插槽,错误可能与此有关吗?
编辑:Debuugger的最后一步在QGenericAtomic.h
T load(const T &_q_value) Q_DECL_NOTHROW
{
return _q_value; // -> Debugger stops here
}
编辑2:我已经使用了答案所说的单例模式,但我的问题仍然存在。
System::GetInstance()->GetObj1()->Import(path); // after this line
在"_q_value"中,它说"
如果您希望使用全局变量,我建议您改用单例。
C++中的全局变量是用extern
而不是静态的来声明的。有关详细信息,请参阅参考。
如果只需要System
类的一个实例,则应使用 Singleton 模式。
但是,当您想要类的唯一实例时,应使用 Singleton 模式,原因不应该是当您想要全局对象时。即使使用此模式,也可以从任何位置访问您的实例。
看看这篇关于单例设计模式的文章,它可能对你有用。
此外,在C++中,全局变量的声明是用extern
完成的,而不是static
。
我已经解决了我的问题。该问题是由 Obj1->Import 方法引起的,但在 qt 调试期间,当我按 F11(单步执行)时,调试器无法访问方法内部。我想不通为什么?
相关文章:
- QT C++中对全局变量的未定义引用
- 使用全局 std::array 引用作为模板参数时如何简化参数?
- 对全局变量的非常量引用的初始化无效
- 在函数中用不同的名称引用全局向量
- C++/Arduino 如何从类内部引用全局
- 使用全局引用调用函数时访问冲突
- 全局引用全局对象
- 将全局变量作为常量引用传递
- 使用 "::member" 引用全局命名空间有什么用吗?
- 为什么我不能使用 constexpr 全局变量来初始化 constexpr 引用类型
- 如何获取LLVM中指令引用的所有全局变量
- 是否可以通过引用将方法从类传递到全局函数或在类之间传递?
- 用ASMJIT引用全局变量
- 未显式引用对象的全局对象构造函数在最终二进制文件 - LD 中被丢弃
- JNI/Android NDK-维护全局对象引用
- GCC链接器抱怨对现有全局变量的未定义引用
- 从模板函数中引用全局数据
- 引用全局命名空间中的某个内容
- 创建构造函数引用全局变量的类的全局实例时,C++ 程序崩溃
- 引用全局变量的模板函数(取决于类型)