创建一个实现派生类单例的基类

bge0

因此,在您让我失望之前,告诉我这是一件可怕的事情,我只想声明,出于好奇和可能的代码减少,我想知道这一点。我想要一个实现派生类单例的基类。但是,这样做会从派生类中丢失数据。如何获得派生类方面的基类以实现单例。例如:

class Application{
public:
/**
 * @brief instance: C++11 [If control enters the declaration concurrently while the     variable is being initialized,
 *the concurrent execution shall wait for completion of the initialization.—§6.7 [stmt.dcl] p4]
 * @return handle to application
 */
static Application& instance(){
    static Application s_Application;
    return s_Application;
}

void setName(std::string Name){
    AppName=Name;
}

std::string getName(){
    return AppName;
}
virtual ~Application(){ }

private:
Application(){}
std::string AppName;
};

现在,我创建一个继承自Application的派生类:

class Test:public Application{
    public:
    void printer(std::string test){
        std::cout<<"test\n";
    }
};


int main(int argc, char *argv[]) {
    Application test1=Test::instance();
    //Test test2=static_cast<Test>(test1);
    test1.setName("bla");
    test1.printer(test1.getName());
}

因此,正如预期的那样,由于返回的对象为“应用程序”类型,因此test1无法调用.printer()方法。有什么方法可以将派生类的类型传递回主类并创建派生类的实例?

编辑:我已经使用CRTP来传递值,但是当我执行以下操作时,它彼此不相等:

Test test1=Test::instance();
Test test2=Test::instance();
cout<<"Is test1 the same as test 2? "<<(&test1==&test2)<<endl;

结果总是FALSE

黄曲霉素

您还需要将复制构造函数和赋值设置为私有,以便不能复制对象(因为仅必须存在对象)。

在你的代码中

Test test1=Test::instance();
Test test2=Test::instance();

你实际上是在打电话

Test test1(Test::instance());

实际上是在呼唤

Test (const Test &);

这是副本构造函数,因此可以创建对象的副本。您实际上正在创建两个不同的对象。这就是为什么他们的地址不同的原因。

因此,将复制构造函数和赋值运算符设为私有,以便没人能复制它。

并使用以下

Test & test1 = Test::instance();
Test & test2 = Test::instance();

在这种情况下,地址将相同。

或者,您可以根据需要返回指针Test::instance

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

创建一个新的基 CDialogEx 派生类

来自分类Dev

CreateDelegate派生类必须提供一个实现

来自分类Dev

如何禁止C ++派生类从基类派生,但允许另一个派生类

来自分类Dev

从派生类派生一个类

来自分类Dev

一个类是否可以包含一个后来专门用于派生类的基类作为成员?

来自分类Dev

从派生类创建基类对象

来自分类Dev

从基类创建派生类的实例

来自分类Dev

基于另一个类创建一个新的派生类型

来自分类Dev

如何在基类中定义一个静态接口,并确保该接口必须在派生类中实现?

来自分类Dev

如何用另一个派生类的协变返回类型实现函数?

来自分类Dev

MethodBuilder.CreateDelegate 抛出异常:“派生类必须提供一个实现。”

来自分类Dev

如何从另一个派生类对象调用派生类虚拟方法

来自分类Dev

从C ++中另一个(不相关!)类的基类引用派生类的对象

来自分类Dev

我如何从另一个类的基类访问派生类中的受保护成员

来自分类Dev

使用Castle.Windsor仅为派生类而不是基类注册一个拦截器

来自分类Dev

可以在派生类中的operator <<调用C ++基类中的另一个operator <<吗?

来自分类Dev

为什么“ this”指针在派生类和第一个基类中具有相同的值

来自分类Dev

派生类会破坏基类的实现吗

来自分类Dev

从派生类中隐藏基类的实现细节

来自分类Dev

使用派生类创建基类对象

来自分类Dev

指向派生类的指针是否首先创建基类?

来自分类Dev

是否可以创建一个维护实例字典的单例工厂类?

来自分类Dev

实现从另一个基类派生的 Generic BaseClass<T>

来自分类Dev

如何使用派生类中的虚函数,在另一个带有基类参数的类中声明?

来自分类Dev

将指向一个派生类的指针传递给另一个

来自分类Dev

对包含另一个派生类的C ++类的继承

来自分类Dev

如何强制一个类实现从特定基类/接口(而不是特定类型)派生的属性

来自分类Dev

设计一个函数,该函数将两个抽象基类对象作为参数,并根据对象的派生类执行不同的操作

来自分类Dev

创建一个List实例,其类型派生自基类和接口

Related 相关文章

  1. 1

    创建一个新的基 CDialogEx 派生类

  2. 2

    CreateDelegate派生类必须提供一个实现

  3. 3

    如何禁止C ++派生类从基类派生,但允许另一个派生类

  4. 4

    从派生类派生一个类

  5. 5

    一个类是否可以包含一个后来专门用于派生类的基类作为成员?

  6. 6

    从派生类创建基类对象

  7. 7

    从基类创建派生类的实例

  8. 8

    基于另一个类创建一个新的派生类型

  9. 9

    如何在基类中定义一个静态接口,并确保该接口必须在派生类中实现?

  10. 10

    如何用另一个派生类的协变返回类型实现函数?

  11. 11

    MethodBuilder.CreateDelegate 抛出异常:“派生类必须提供一个实现。”

  12. 12

    如何从另一个派生类对象调用派生类虚拟方法

  13. 13

    从C ++中另一个(不相关!)类的基类引用派生类的对象

  14. 14

    我如何从另一个类的基类访问派生类中的受保护成员

  15. 15

    使用Castle.Windsor仅为派生类而不是基类注册一个拦截器

  16. 16

    可以在派生类中的operator <<调用C ++基类中的另一个operator <<吗?

  17. 17

    为什么“ this”指针在派生类和第一个基类中具有相同的值

  18. 18

    派生类会破坏基类的实现吗

  19. 19

    从派生类中隐藏基类的实现细节

  20. 20

    使用派生类创建基类对象

  21. 21

    指向派生类的指针是否首先创建基类?

  22. 22

    是否可以创建一个维护实例字典的单例工厂类?

  23. 23

    实现从另一个基类派生的 Generic BaseClass<T>

  24. 24

    如何使用派生类中的虚函数,在另一个带有基类参数的类中声明?

  25. 25

    将指向一个派生类的指针传递给另一个

  26. 26

    对包含另一个派生类的C ++类的继承

  27. 27

    如何强制一个类实现从特定基类/接口(而不是特定类型)派生的属性

  28. 28

    设计一个函数,该函数将两个抽象基类对象作为参数,并根据对象的派生类执行不同的操作

  29. 29

    创建一个List实例,其类型派生自基类和接口

热门标签

归档