必威体育Betway必威体育官网
当前位置:首页 > IT技术

复合Composition 笔记----C++学习之路

时间:2019-07-22 06:10:00来源:IT技术作者:seo实验室小编阅读:60次「手机版」
 

composition

1.composition 复合,可以表示has-a。一个class中有一个另外一种东西。这个class与另外一个东西就叫做复合。

复合关系尽量用图来表示会更加明白。

template<class T>
class queue
{
    ...
protected:
    deque<T> c;
public:
    bool empty() const { return c.empty(); }
    size_type size() const { return c.size(); }
    reference front() {return c.front(); }
    reference back() { return c.back(); }
    void push(const value_type& x) { c.push_back(x); }
    void pop() { c.pop_front(); }
};
 可以看到queue中含有deque。queue是一个单向队列,先进先出。而deque是双向队列,两段都可以进出。

可以看的出deque的功能会更加强大,通过对deque的改装,来实现queue。

代码中可以看到,queue中没有多做事情,deque中的pop_front()变成了pop()。

从复合可以得到一个设计模式:Adapter 改造。

这只是一个特别的例子。

2.从内存的角度看Composition:

以一个例子来看:

(1)queue代码:

template <class T>
class queue
{
protected:
    deque<T> c;
    ...
};
( 2 )deque代码:
template <class T>
class deque
{
protected:
    Itr<t> start;
    Itr<t> finish;
    T** map;
    unsigned int map_size;
};
(3)Itr代码:
template <class T>
struct Itr
{
    T* cur;
    T* first;
    T* last;
    T** node;
    ...
};

可以看出,queue复合deque,deque复合Itr。

从Itr中有四个指针,占有16个指针。

deque中有两个Itr与一个指针和一个无符号int,就是16*2+4+4=40.

queue中只有一个deque,那就是40.。

3.Composition关系下的ctor与dtor:

Container---->component

(1)构造函数的关系:

毋庸置疑,构造肯定需要从内到外的构造,只有构造好拥有的东西,才能再取构造自己。

所以,要先调用Component中的default的构造函数,再执行自己。

container::Container(.....):Component(){.......};  黑体的东西是由编译器来做的的。

(2)析构函数的关系:

恰好相反,析构函数首先执行自己,然后再调用Component的析构函数。

Container::~Container(...){....~Component() };

要知道这些都是编译器自己安排好的,这些次序编译器都会帮助假如这些代码,无需自己写出来。

(3)第一点中间提到default构造函数,Component中可能会有很多析构函数,但是编译器只会帮助你调用

default构造函数,如果你需要指明调用哪个构造函数则需要你自己去写。

相关阅读

华为OJ——C++版合集

一、引言 最近把牛客网上华为在线机试训练题刷了一遍。还是比较有用的,貌似都来自华为内部OJ题库,已经顺利入职。现在分享一下我的

c++恢复msconfig.exe禁用的服务和自启动项

msconfig.exe禁用自启动项 msconfig.exe禁用自启动项的时候,都是先删除注册表自启动目录下的相应的项,比如TIM,在msconfig禁用了之

C/C++字符串、字符数组的总结

一、定义 字符数组:存储字符的数组 字符串 :是使用最频繁的字符数组,是一个特殊的字符数组 C++中并没有专门的字符串的类型,一个字

【C++广度搜索】营救

我想不会有什么帮助的索引 队列我有写过一篇题解来说明,见:【C++广度搜索入门】面积 这是我的第二篇广搜题解,可能仍有众多不足,请大

[转]C/C++定义全局变量/常量几种方法的区别

在讨论全局变量之前我们先要明白几个基本的概念:原文章地址:https://www.cnblogs.com/wanghetao/p/4492582.html1. 编译单元(模块)

分享到:

栏目导航

推荐阅读

热门阅读