使用C ++中的合成进行对象实例化计算

你懂的

Meyers在更有效的C ++中描述了一种使用对象计数基类(项目26)来计算对象实例化的方法。是否可以使用以下合成技术来实现相同的功能。使用私有继承是否有特定的优势?在这种情况下使用组合有什么弊端?

ps:-我经过细微的修改就重用了更有效的C ++中的代码。

    #ifndef COUNTERTEMPLATE_HPP_
    #define COUNTERTEMPLATE_HPP_
    #include <iostream>
    #include <stdio.h>
    #include <stdlib.h>

    template <class BeingCounted>
    class Counted {
    public:
        static int ObjectCount(){return numOfObjects;}
        Counted();
        Counted(const Counted& rhs);
        ~Counted(){--numOfObjects;}
    protected:
    private:
        static int numOfObjects;
        static int maxNumOfObjects;
        void init();
    };

    template<class BeingCounted> Counted<BeingCounted>::Counted()
    {
        init();
    }

    template<class BeingCounted> Counted<BeingCounted>::Counted(const Counted& rhs)
    {
        init();
    }

    template<class BeingCounted> void Counted<BeingCounted>::init()
    {
        if(numOfObjects>maxNumOfObjects){}
        ++numOfObjects;
    }

    class Printer
    {
            public:
        static Printer* makePrinter(){return new Printer;};
        static Printer* makePrinter(const Printer& rhs);
        Counted<Printer>& getCounterObject(){return counterObject;}
        ~Printer();
            private:
        Printer(){};
        Counted<Printer> counterObject;
        Printer(const Printer& rhs){};
    };

    #endif /* COUNTERTEMPLATE_HPP_ */

深的

这个问题与

在这两个中,一个可能是另一个的重复。但是没有一个回答这个问题,而且我不愿将我的回答发布给其中一个。


私有继承可以利用空基类优化:

class Printer0
{
    Counted<Printer0> counterObject;
    int m;
};

class Printer1 : Counter<Printer1>
{
    int m;
};

Clang ++和g ++都说sizeof(Printer0) == 8sizeof(Printer1) == 4

原因是数据成员必须具有不同的地址,但是单个空基类不需要用完对象中的内存。所以counterObject是一个字节大,并int与4个字节对齐,因此Printer0如下所示:

  | | XX | | 
  0 1 2 3 4 5 6 7 8 9 
          ^ ~~~~~~~~ m 
      ^ ~~~填充
  ^ ~~~ counterObject

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用C ++中的合成进行对象实例化计算

来自分类Dev

计算使用LINQ函数实例化的C#对象中的天数

来自分类Dev

使用Spring实例化对象以进行测试和生产

来自分类Dev

使用类实例的指针进行初始化是C ++中唯一的吗?

来自分类Dev

使用C#中的嵌套类反序列化JSON。在哪里创建对象实例?

来自分类Dev

是否可以使用指向未实例化对象的指针作为C ++中的变量?

来自分类Dev

无法在字符串中使用C#中的反射/汇编/激活器实例化对象

来自分类Dev

在 C# 中使用基类和派生类实例化数组中的对象

来自分类Dev

在Robot Framework中实例化C#对象

来自分类Dev

如何防止在C#中实例化对象

来自分类Dev

如何防止在C#中实例化对象

来自分类常见问题

使用Java Stream实例化文件中的对象

来自分类Dev

使用模型方法实例化Django中的对象

来自分类Dev

JUnit-使用参数中的对象测试类实例化

来自分类Dev

如何使用Java中的按钮实例化对象?

来自分类Dev

使用jython在Python中实例化与Java相同的对象

来自分类Dev

如何使用jamod库在Java中实例化Register对象?

来自分类Dev

如何使用函数实例化空对象中的值

来自分类Dev

C ++对象实例化-使用空括号实例化对象时调用哪个构造函数

来自分类Dev

C ++:使用友善类限制对象实例化

来自分类Dev

C#中的对象实例化之间的区别:将对象存储在引用中与直接调用方法

来自分类Dev

在使用流API的Java 8中,如何从Map返回实例并需要进行多次计算

来自分类Dev

使用反射的对象实例化在VB.NET中有效,但在C#中不起作用

来自分类Dev

使用C#进行复杂的JSON对象序列化

来自分类Dev

如何获得对在Objective-C中实例化第二个对象的对象的引用?

来自分类Dev

C ++,使用模板实例化存储对象实例的通用节点

来自分类Dev

用不同的对象实例化c ++ Vector

来自分类Dev

C ++实例化“隐式”类对象

来自分类Dev

实例化对象的堆栈分配C ++

Related 相关文章

  1. 1

    使用C ++中的合成进行对象实例化计算

  2. 2

    计算使用LINQ函数实例化的C#对象中的天数

  3. 3

    使用Spring实例化对象以进行测试和生产

  4. 4

    使用类实例的指针进行初始化是C ++中唯一的吗?

  5. 5

    使用C#中的嵌套类反序列化JSON。在哪里创建对象实例?

  6. 6

    是否可以使用指向未实例化对象的指针作为C ++中的变量?

  7. 7

    无法在字符串中使用C#中的反射/汇编/激活器实例化对象

  8. 8

    在 C# 中使用基类和派生类实例化数组中的对象

  9. 9

    在Robot Framework中实例化C#对象

  10. 10

    如何防止在C#中实例化对象

  11. 11

    如何防止在C#中实例化对象

  12. 12

    使用Java Stream实例化文件中的对象

  13. 13

    使用模型方法实例化Django中的对象

  14. 14

    JUnit-使用参数中的对象测试类实例化

  15. 15

    如何使用Java中的按钮实例化对象?

  16. 16

    使用jython在Python中实例化与Java相同的对象

  17. 17

    如何使用jamod库在Java中实例化Register对象?

  18. 18

    如何使用函数实例化空对象中的值

  19. 19

    C ++对象实例化-使用空括号实例化对象时调用哪个构造函数

  20. 20

    C ++:使用友善类限制对象实例化

  21. 21

    C#中的对象实例化之间的区别:将对象存储在引用中与直接调用方法

  22. 22

    在使用流API的Java 8中,如何从Map返回实例并需要进行多次计算

  23. 23

    使用反射的对象实例化在VB.NET中有效,但在C#中不起作用

  24. 24

    使用C#进行复杂的JSON对象序列化

  25. 25

    如何获得对在Objective-C中实例化第二个对象的对象的引用?

  26. 26

    C ++,使用模板实例化存储对象实例的通用节点

  27. 27

    用不同的对象实例化c ++ Vector

  28. 28

    C ++实例化“隐式”类对象

  29. 29

    实例化对象的堆栈分配C ++

热门标签

归档