C++最强大的特性之一——模板Templates(下:模板类)

 

本文为作者EricNTH的原创博客,允许转载但请务必注明出处!

嗨,大家好,我们又见面了,今天我们来继续谈谈C++模板——模板类。

目录

1.C++最强大的特性之一——模板Templates(上:模板函数)—原创
2.C++最强大的特性之一——模板Templates(下:模板类)—原创

好了,现在公布上次作业的答案!
(由于还没有人评论【哭】,没法放各位的啊,不过只要后面有人做了我一定会第一时间放上去)
——————————————————————————————

模板类的声明

模板类的声明与模板函数相差不多,下面举个栗子:

template <typename _Tp>
class MyClass
{
    public:
    //Functions&declarations
    protected:
    //Functions&declarations
    private:
    //Functions&declarations
}

一切都是如此的相似,那么我们来看一下声明吧。

MyClass <int> myclass1;

很像吧,几乎一样?没错!
唯一的区别就是不能自动补充类型(如int)。

其实,STL中的一切容器,都是模板类!(STL的算法也基本都是模板函数)
For example:

vector<int>;
set<int>;
map<char*, int>;
bitset<4>;

(纠个错:bitset并不是STL容器,是一个STL实用类)
大家可能注意到了,< >之间可能不止有一个typename,而且还可以有数字这些东西!
我们来看一下vector的声明。

template<typename _Tp, typename _Alloc = std::allocator<_Tp> >
    class vector : protected _Vector_base<_Tp, _Alloc>

没错,< >之间也可以像函数一样,使用默认值!
那为什么要用模板呢?

  • 函数的参数中不能有typename。
  • STL用的也是模板,有样学样【哈哈】
  • 在ANSI C++标准中,所有最新版本的编译器都全面支持(当然函数也是)。
  • 别忘了,还有模板类!这个肯定时必用不可了。

注意:以上讲的大部分都同样适用于模板函数(如设默认值等)。

亲自尝试吧!来自己写一个模板类Stack!

template <typename T>
    class Stack {
        private:
            int len;
            int ptr;
            T sta[3000];
            bool Good;
        public:
            Stack() {
                len = 0;
                ptr = -1;
                Good = true;
            }
            ~Stack() {
                clear();
                Good = false;
                ptr = -1;
                len = 0;
            }
            bool CheckGood (void) {
                return Good;
            }
            void push(T pushed_data) {
                if (!Good) {
                    return;
                }
                ptr++;
                sta[ptr] = pushed_data;
            }
            void pop(void) {
                ptr--;
                if (ptr < -1) {
                    MessageBox(NULL, "Fatal Error --- Warning before crashing\nAdvice: Close this file and edit and compile again.\nOr this program may CRASH.\nError name: underflow.\nIn function: pop.", "my_header.hpp", 18);
                    Good = false;
                }
                if (!Good) {
                    return;
                }
            }
            T visit(int index) {
                if ((index - 1) > ptr) {
                    MessageBox(NULL, "Failed to visit!", "my_header.hpp", 18);
                }
                if (index < 1 || (index - 1) > ptr)  {
                    MessageBox(NULL, "Fatal Error --- Warning before crashing\nAdvice: Close this file and edit and compile again.\nOr this program may CRASH.\nError name: underflow.\nIn function: visit.", "my_header.hpp", 18);
                    Good = false;
                } 
                return sta[index - 1];
            }
            int size(void) {
                srand(time(0));
                if (Good) {
                    return ptr + 1;
                }
                return rand();
            }
            void clear() {
                ptr = -1;
                len = 0;
                Good = false;
            }
    };

基本都很简单,大家应该看得懂(我自认为【笑】),至于MessageBox函数,是用来弹出错误信息的,用法大家可以参见这篇博客:Windows API 教程:MessageBox函数详解

The end

好了,有关于模板我们就讲到这里了。模板很强大,很好用,但绝不简单。需要大家认真练习,琢磨,思考,有任何问题(很有可能)一定要联系我,或看其他小伙伴们的博客。这里再和大家说一下我的联系方式,我看到后一定尽快回复!

  • 直接再评论区回复,我看得到
  • 邮箱:eric_ni2008@163.com
  • 或私信我,我没有设置任何联系方式的权限,大家可以自由选择!

好了,今天也不早了,模板也讲完了,我们下期再见!

本文为作者EricNTH的原创博客,允许转载但请务必注明出处!

返回上一篇:C++最强大的特性之一——模板Templates(上:模板函数)

喜欢麻烦点个赞或加个关注呗~

原文链接: https://www.cnblogs.com/EricNTH/p/12436250.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    C++最强大的特性之一——模板Templates(下:模板类)

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/332193

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月1日 下午6:23
下一篇 2023年3月1日 下午6:23

相关推荐