C和C++的面向对象专题(5)——合理使用模板,避免代码冗余

本专栏文章列表

一、何为面向对象

二、C语言也能实现面向对象

三、C++中的不优雅特性

四、解决封装,避免接口

五、合理使用模板,避免代码冗余

六、C++也能反射

七、单例模式解决静态成员对象和全局对象的构造顺序难题

八、更为高级的预处理器PHP

五、合理使用模板,避免代码冗余

下面我们来讨论一下,如何解决模板的不易封装的问题。

我们提供这样一种思路,对于链表一类的通用类型,我们尽量采取强制类型转换的方式,尽量避免模板的滥用。

同样,我们应该避免对结构体的直接存储,尽量使用类似java的指针传递方式来传递对象。

我们首先来写一个单类型的list

#ifndef LIST_C_H
#define LIST_C_H

class list_c_private;
struct list_c_node;

class list_c {
public:
    list_c();
    ~list_c();

    void insert(void*);
    int size();
    void* get(int);

protected:
    list_c_private* priv;
};

#endif // LIST_C_H

这里我们使用了之前讲到的封装方式,降低了类间的耦合度

#include "list_c.h"

class list_c_private
{
public:
    int size;
    list_c_node* head;
};  

struct list_c_node
{
    void* data;
    list_c_node* next;

    list_c_node() {
        data = next = nullptr;
    }
};

list_c::list_c() {
    priv = new list_c_private();
    priv->head = new list_c_node();
}

list_c::~list_c() {
    delete priv;
}

void list_c::insert(void* data) {
    list_c_node* p;
    for (p = priv->head; p->next != nullptr; p = p->next) {}
    p->next = new list_c_node();
    p->next->data = data;
}

int list_c::size() {
    return priv->size;
}

void* list_c::get(int k) {
    int t; list_c_node* p;
    for (p = priv->head->next, t = 0; p != nullptr && t != k ; p = p->next, ++t) {}
    return p->data;
}

这是一个简单的链表,只是作为示例使用,写了插入和获取的两个方法。

而为了通用性支持,我们写一个模板,进行类型的强制转换:

#ifndef LIST
#define LIST

#include "list_c.h"

template<typename T>
class list {
public:
    list() { clist = new list_c(); }
    ~list() { delete clist; }

    void insert(T data) {
        clist->insert((void*)data);
    }

    int size() { return clist->size(); }

    T get(int k) {
        return (T)clist->get(k);
    }

protected:
    list_c* clist;
};

#endif // LIST

这样,带来的好处有,首先能够将模板封装操作,其次,能够在封装类中,动态的调整内部实例。

对于一个传入的类型,你可以判断一下,是否适合当前的模板,如果不适合,可以在其中动态的报错。

最后是模板的使用:

#include <iostream>
#include "list"
using namespace std;

int main(){
    list<long> testlist;
    testlist.insert(10);
    testlist.insert(20);

    long k = testlist.get(1);
    printf("%d\n", k);
    return 0;
}
时间: 2024-08-05 10:12:48

C和C++的面向对象专题(5)——合理使用模板,避免代码冗余的相关文章

C和C++的面向对象专题(8)——更为高级的预处理器PHP

本专栏文章列表 一.何为面向对象 二.C语言也能实现面向对象 三.C++中的不优雅特性 四.解决封装,避免接口 五.合理使用模板,避免代码冗余 六.C++也能反射 七.单例模式解决静态成员对象和全局对象的构造顺序难题 八.更为高级的预处理器PHP 八.更为高级的预处理器PHP C++的宏在某些情况下非常难用,例如将代码展开成为这样: Macro( A, B, C, D ) => func("A", A); func("B", B); func("C&

C和C++的面向对象专题(1)——何为面向对象

题记: 面向对象是一种思想,而不是一门语言 我们上哪去找对象,都面向对象去了 本专栏文章列表 一.何为面向对象 二.C语言也能实现面向对象 三.C++中的不优雅特性 四.解决封装,避免接口 五.合理使用模板,避免代码冗余 六.C++也能反射 七.单例模式解决静态成员对象和全局对象的构造顺序难题 八.更为高级的预处理器PHP 一.何为面向对象 现在学软件开发,都讲面向对象的编程模型,其实也很简单.用一句话来总结,面向对象就是将方法和方法的属性整合在一起,让每个方法引用的属性值尽可能在对象内部,对外

C和C++的面向对象专题(2)——C语言也能实现面向对象

本专栏文章列表 一.何为面向对象 二.C语言也能实现面向对象 三.C++中的不优雅特性 四.解决封装,避免接口 五.合理使用模板,避免代码冗余 六.C++也能反射 七.单例模式解决静态成员对象和全局对象的构造顺序难题 八.更为高级的预处理器PHP 二.C语言也能实现面向对象 今天要为大家介绍C语言的面向对象设计方法,正如题记上面所说,面向对象是一种思想,而并非是一种语言,我们将会介绍C语言实现的面向对象开发方式. 简单实用的C语言面向对象设计思路 众所周知,C++中的面向对象十分方便,但在C中,

C和C++的面向对象专题(3)——C++中的不优雅特性

本专栏文章列表 一.何为面向对象 二.C语言也能实现面向对象 三.C++中的不优雅特性 四.解决封装,避免接口 五.合理使用模板,避免代码冗余 六.C++也能反射 七.单例模式解决静态成员对象和全局对象的构造顺序难题 八.更为高级的预处理器PHP 三.C++中的不优雅特性 今天来说一说C++中不优雅的一些问题,C++虽然是面向对象的设计语言,但也有很多缺陷和弊病,我们将会讨论如何通过良好的设计解决这些问题. C++编译缓慢 C++编译慢已经成为了业界共识,一个大型C++项目甚至要用专用的服务器编

C和C++的面向对象专题(9)——Gtkmm的最佳实践

本专栏文章列表 一.何为面向对象 二.C语言也能实现面向对象 三.C++中的不优雅特性 四.解决封装,避免接口 五.合理使用模板,避免代码冗余 六.C++也能反射 七.单例模式解决静态成员对象和全局对象的构造顺序难题 八.更为高级的预处理器PHP 九.Gtkmm的最佳实践 九.Gtkmm的最佳实践 在跨平台的gui开发中,Qt一直是非常受欢迎的GUI开发框架,但Qt一个是依赖反射,需要特殊的预处理步骤,一个是库太过庞大,这就造成了一些不便的地方.今天介绍给大家的是Gtk库的C++绑定,Gtkmm

C和C++的面向对象专题(7)——单例模式解决静态成员对象和全局对象的构造顺序难题

本专栏文章列表 一.何为面向对象 二.C语言也能实现面向对象 三.C++中的不优雅特性 四.解决封装,避免接口 五.合理使用模板,避免代码冗余 六.C++也能反射 七.单例模式解决静态成员对象和全局对象的构造顺序难题 八.更为高级的预处理器PHP 七.单例模式解决静态成员对象和全局对象的构造顺序难题 上回书说道,我们的程序有一个隐藏的漏洞,如果ClassRegister这个类所在的.o文件,如果在所有.o文件中是第一个被链接的的,那么就不会出问题. 这么说太抽象了,让我们画个图表 ClassRe

C和C++的面向对象专题(6)——C++也能反射

本专栏文章列表 一.何为面向对象 二.C语言也能实现面向对象 三.C++中的不优雅特性 四.解决封装,避免接口 五.合理使用模板,避免代码冗余 六.C++也能反射 七.单例模式解决静态成员对象和全局对象的构造顺序难题 八.更为高级的预处理器PHP 六.C++也能反射 今天我们来探讨C++的反射问题,缺乏反射机制一直是C++的大问题,很多系统的设计时,需要根据外部资源文件的定义,动态的调用内部的函数和接口,如果没有反射,将很难将外部的数据,转换为内部的方法. Java和.net的反射机制很容易实现

C和C++的面向对象专题(4)——解决封装,避免接口

本专栏文章列表 一.何为面向对象 二.C语言也能实现面向对象 三.C++中的不优雅特性 四.解决封装,避免接口 五.合理使用模板,避免代码冗余 六.C++也能反射 七.单例模式解决静态成员对象和全局对象的构造顺序难题 八.更为高级的预处理器PHP 四.解决封装,避免接口 恩,今天我们来讨论,如何通过设计,解决C++中的不优雅特性,改进项目的结构,改善编译速度. 上次我们提到,如果一个类的封装不好,容易导致种种不便,那么如何设计能够避免这种现象呢? class test { public: voi

织梦DedeCms 5.7 自定义专题节点容器模板修正

1.修改添加/编辑专题的模板文件 文件位于 dede\templets下面的 spec_edit.htm 文件,打开文件并找到 “单条记录的模板:” ,在 后面添加下面的代码 节点容器模板: 1 2 3 节点容器模板:<input id="notetemplet<?php echo $i?>" style="width: 300;" type="text" name="notetemplet<?php echo