c++ - 多个类中的单例对象的多次访问
问题描述
我有一个结构,多个类可以访问和编辑。所以我在类中创建了这个结构的对象作为静态对象并创建了一个 get 方法。 在 Class1.cpp 中:
#include "Class1.h"
static MyStruct struct;
MyStruct* Class1::get_my_struct()
{
return &struct;
}
我想将这个类的对象创建为一个单例,以保证可以通过单个对象访问这个结构。
在 Class2.cpp 中:
#include "Class2.h" //Class1.h file included in this file.
void Class2::log_value()
{
Class1& singleton_obj_cls1 = Class1::getObject(): //return singleton object
singleton_obj_cls1 .get_my_struct().tempr_val=log_temp_val(); //log this value of struct by class 2 method
}
void Class2::change_value()
{
Class1& singleton_obj_cls1 = Class1::getObject():
//Do I have to get the singleton object for different methods even though they are in the same class?
//Can a singleton object get in one place in class and the whole class use it as a class member?
singleton_obj_cls1 .get_my_struct().tempr_val=45;
singleton_obj_cls1 .get_my_struct().x_val=66 ;
}
我有使用 class1 和 class 2 的 class 3 类。顺便说一下,我将 class2`构造函数更改为单例。
在 Class3.cpp 中:
#include "Class3.h" //Both Class1.h and Class2.h file included in this file.
void Class3::calculate_value()
{
Class1& singleton_obj_cls1 = Class1::getObject():
Class2& singleton_obj_cls2 = Class2::getObject():
singleton_obj_cls2.log_value();
singleton_obj_cls1.get_my_struct().pressure_value=300;
}
我的第三个问题是,是否有更好的设计方法可以修复,而不是在使用每个结构之前在多个位置获取单例对象,或者我应该在顶级类中创建一次对象并将其作为参数提供给所有 100 种方法(可能是 20 种)应该有权访问此结构的不同类?
解决方案
- 即使它们在同一个类中,我是否必须为不同的方法获取单例对象?
- 一个单例对象可以在课堂上的一个地方,整个班级都将它用作班级成员吗?
在头文件中使用成员变量并在构造函数成员初始化器列表中对其进行初始化:
示例Class2.h
#include "Class1.h"
class Class2 {
//...
private: // maybe public/protected to access from other classes
Class1& m_singleton_obj_cls1;
};
示例Class2.cpp
#include "Class2.h"
Class2::Class2()
: m_singleton_obj_cls1(Class1::getObject()) {
}
//...
推荐阅读
- python - 异常触发:“NoneType”对象没有属性“app”
- node.js - Appium - 收到错误未定义:未定义参考元素
- python - 引发 TesseractError(proc.returncode, get_errors(error_string))
- reactjs - 将 react.js 中已渲染元素的 innerHTML 设置为组件
- c# - Entity Framework 6,Update-Database -verbose 命令没有构建正确的文件路径来保存我的 mdf 文件
- android - 在从相机拍摄的图像上添加文字并想在上面画线
- ios - 在ios后台拨打电话
- javascript - 如何使 ajax 请求在页面加载时起作用
- javascript - JQuery DataTable:如何隐藏多个变量列
- azure - 未为成员 Microsoft.Azure.Services.AppAuthentication.AzureServiceTokenProvider 解析类型