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

时间:2015-07-27 09:39:31

标签: c++ oop inheritance singleton

它可能已经得到了解答,但是由于让我感到头痛而让我感到很困扰,这就是我要求解决方案或解释的原因。

问题在于我正在开发一个系统,我想在其中只有一个属性(在应用程序方面)struct或者可以从我的代码中的任何地方访问。 为了给你更大的计划,我希望在类对象中保存我的所有属性,让我们说属性。所以我决定选择Singleton。 关键是我希望派生对象的值和getter-setter方法来自基类Properties。 例如,我想让两个不同的类Component1Properties和Component2Properties说两个不同的对象。现在我希望我的属性单例创建一个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的值,如下所示:

String value = Properties :: getInstance()。component1Properties.getValue(); 属性::的getInstance()component1Properties.setValue(值);

我的问题是 这有点可行吗? 2.根据我的需求,架构是否正确? 我做错了什么?

感谢您的理解和对不起,如果这是显而易见的事情,但实际上我正在尝试熟悉C ++中的OOP原则,但事情对我来说非常混乱,而且我只是头痛而不是结果

2 个答案:

答案 0 :(得分:0)

你不能以你想要的方式直接工作,只是因为如果你想拥有两个对象Component1PropertiesComponent2Properties,两者都有{{ 1}}作为基类,那么你将拥有至少两个<{1}}类的副本:每个组件属性中有一个。这就是继承的工作方式,但这显然会破坏你的单身方法。

可以做的是让Properties持有引用(或者,指针)到Properties对象,以及同样适用于Component1Properties。在这种情况下,可以在组件属性对象之间共享Properties对象。

然后你可以让Component2Properties对象为特定组件生成对象,最有可能是通过一些工厂模式,尽管我会为此建议一个单独的类,如Properties。它可能也是一个单例,甚至可以包含在Properties类中,但更好的可能是主PropertiesFactory类,它是一个生成全局Properties的工厂以及每个对象的属性

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

Properties

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

答案 1 :(得分:0)

基于注册表的单身人士

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