具有派生对象函数调用的 C++ 单例对象

C++ singleton object with derived objects function calls

可能已经有人回答了,但它让我很头疼,这让我很困扰,所以这就是为什么我要寻求解决方案或解释的原因。

问题是我正在开发一个系统,在这个系统中,我只想在我的代码中的任何地方访问一个属性(就应用程序而言)结构或某物。 为了给你一个更大的计划,我想把我所有的属性都放在一个 class 对象中,让我们说属性。所以我决定在这个上使用 Singleton。 关键是我想要派生对象及其值和来自基本 class 属性的 getter-setter 方法。 例如,我想说来自两个不同 classes Component1Properties 和 Component2Properties 的两个不同对象。现在我希望我的 Properties 单例创建一个 Components1Properties 对象和一个 Component2Properties 对象,这样每次我得到相同的实例时我都会有相同的派生对象。 现在接下来让我们向每个派生对象添加一个静态字符串 "property" 并为此字符串声明一个 getter 和 setter 方法。

我面临的问题是我想在我的代码中的任何地方调用派生对象函数并获取和设置这些对象中的值 例子: 在我的 .h 文件中:

class Properties
{
public:

static Properties& getInstance() 
{
 if instance==NULL} instance = new Properties();
return *instance;
}

private:

Properties();
static Properties* instance;
};

class Compoment1Properties : public Properties
{
public:
String property1;
void setProperty1(String value){
     property1 = value;
}
String getValue(){
     return property1
}
Component1Properties();
~Component1Properties(){};
};

然后在我的 .cpp 文件中有

Properties::Properties()
{
 Component1Properties component1Properties;
}

我希望代码中的任何地方都能够获取或设置 Component1Properties 的值,例如:

字符串值=Properties::getInstance().component1Properties.getValue(); Properties::getInstance().component1Properties.setValue(值);

我的问题是 1.这是否可行? 2.架构是否符合我的需要? 3. 我做错了什么吗?

感谢您的理解,如果这是显而易见的事情,我深表歉意,但实际上我正在尝试熟悉 C++ 中的 OOP 原则,但对我来说事情很糟糕,我只是头疼而不是结果。

你不能让它直接按照你想要的方式工作,只是因为如果你想要能够拥有两个对象Component1PropertiesComponent2Properties , 两者都以 Properties 作为基础 class, 那么你将有 至少两份 Properties class: 每份一份组件属性。这就是继承的工作原理,但这显然打破了你的单例方法。

可以做的是让Component1Properties持有一个引用(或者,好吧,指针)到一个Properties 对象,Component2Properties 也是如此。在这种情况下,可以在组件属性对象之间共享 Properties 对象。

然后您可以让 Properties 对象为特定组件生成对象,很可能是通过某种工厂模式,尽管我建议为此使用单独的 class,例如 PropertiesFactory。它也可能是一个单例,甚至包含在 Properties class 中,尽管更好的可能是 main PropertiesManager class,它是一个生产全局的工厂 Properties 以及每个对象的属性。


如果每个组件属性只是全局属性的一个子集,则另一种方法可能可行。在这种情况下,您可以有单独的 Component{1,2}Properties classes 和 Properties class 继承所有 ComponentXProperties:

class Properties : public Component1Properties, Component2Properties {
};

在这种情况下,您可以将全局 Properties 对象转换为您需要的任何 class。如果你的组件有一些共同的属性,你也可以在这里尝试虚拟继承的技巧,但总的来说,这似乎太复杂且容易出错。

基于注册表的单例

  1. 在 BASE class 中使用指向基 class 的指针映射来存储对象和 class 名称。
  2. 使用受保护的方法在 BASE class 中注册和注销,它接受 BASE* 和派生的字符串名称 class。 respect 和 unregister 方法在 map 中插入和删除对象,尊重。小心删除,因为从中删除对象并不意味着调用析构函数!!
  3. 向基class添加静态查找方法以检查对象是否在地图中。 3.In DERIVED class,构造函数是私有的。对于 getInstance,您需要先进行查找,如果它 returns 没有对象,则使用私有构造函数实例化并使用当前派生的 class 名称注册该对象。