一点C++技巧

C和C++中的一点泛化技巧 首先讲回调机制。回调机制,C中用函数指针,C++中用函数对象。 考虑一个比较大小的函数,当然,这个例子比较傻 C中: int cmp(void* a,void* b,int (*fun)(const void*,const void*))  { return fun 阅读详情

 在公司的代码里面看到了一个C++的wrapper class,以前没有见过这样的封装,贴出来备忘。

class LoggerPtr
{
private:
    // Pointer to a logger object owned by client
    Logger *m_logger;
   
    // Instance of a Null Logger, to be used when we don't
    // have a pointer to an actual logger.
    NullLogger m_nullLogger;

public:
   
    // Default constructor. This constructor is marked as explicit
    // since we don't want IQscLoggerPtr objects being created
    // 'on the fly' (i.e. implicitly).
    explicit LoggerPtr(Logger *logger = 0) : m_logger(logger)
    {
    }

   
    // Destructor. We don't delete the logger pointer, since it is owned by
    // our client.
    virtual ~ILoggerPtr()
    {
    }
   

    // Overload for -> operator that returns a pointer to a logger interface
    // if it exists, or a pointer to a Null Logger otherwise.
    inline Logger * operator->() const
    {
        if (m_logger)
        {
            return m_logger;
        }
        else
        {
   
            // We don't have a logger, so return a pointer to the Null
            // logger.
            return const_cast<Logger *>((const Logger *)&m_nullLogger);
        }
    }

   
    // User Defined Conversion operator to return a pointer to encapsulated
    // logger object, or a pointer to a Null logger if one doesn't exist.
    inline operator Logger *() const
    {
        if (m_logger)
        {
            return m_logger;
        }
        else
        {
            // We don't have a logger, so return a pointer to the Null
            // logger.
            return const_cast<Logger *>((const Logger *)&m_nullLogger);
        }
    }

    LoggerPtr & operator = (Logger *logger)
    {
        m_logger = logger;

        return *this;
    }

    // Sets internal logger pointer
    void Logger(Logger *logger)
    {
        m_logger = logger;
    }
}

 

它封装了IQscLogger。这样的好处是如果使用者用到了一个空的logger,那么也不会引起什么问题。当然这样做似乎也有个问题,如果确实是使用者的疏忽造成的,这样处理是不是还不如产生一个严重错误呢?从这个意义上来讲,null logger更像是一个default logger。

c++在一个cpp文件中调用另一个cpp文件的函数的两种方法 有时候写代码为了简便,会将一些函数方法单独在一个cpp的源文件中定义,然后在另一个源文件中需要用到自定义的函数时直接调用就可以了!学过c++的人可能最熟悉的方法还是利用头文件来进行调用,其实还有一种c语言当中的方法一般情况下同样可以适用与c++中! 方法1:创建头文件 举个简单的例子: 首先创建一个method.h头文件,声明一个求最大值的函数max(int x,int y),然后再创建一个同名的源文件method.cpp,在该文件中实现函数max(int x,int y)的功能。代码如下: //metho 阅读详情

相关推荐

C++】使用 yaml-cpp 库操作 YAML

配置文件有利于我们灵活配置工程,解决大量重复劳动,也方便调试。YAML 是一种人类可读的数据序列化格式,它使用缩进和特定的符号来表示数据结构。在本文中,我们将详细介绍如何在 C++ 中使用yaml-cpp库来解析和生成 YAML 格式的数据。

coco的专栏 4945

跟我学c++高级篇——模板元编程之四Wrapper

c++中的Wrapper进行分析说明,并举一些例子来测试

fpcc的专栏 4169

C++ Wrapper Class for the DirectSound API封装DirectSound API

C++ Wrapper Class for the DirectSound API封装DirectSound API的包装类

封装——为成员变量提供存取函数_Java风格命名

任务描述 本关有一个未完成的类 Int,该类含有一个成员变量,请为该成员变量编写存取函数。存取函数以 Java 风格命名,具体请参考主函数中的代码。 相关知识 封装是面向对象的特性之一。当类的成员设置为 private 之后,为了在类外访问该成员,必须提供存取函数。Java 的存取方法有固定的命名方式。假设类的成员名为 something,则取方法的方法名为 getSomething,存方法的方法名为 setSomething。 所以 Java API 中有大量的以 get 和 set 开头的方法。

qq_60786476的博客 3033

包装类Wrapper Class基础总结

Map<String,String> map=new HashMap<>();//注意其声明格式 System.out.println(map.size());//获取map键值对个数 System.out.println(map.isEmpty());//判断map是否为空 System.out.println(map.g...

weixin_46009158的博客 735

包装类Wrapper Class

为什么需要包装类? Java并不是纯面向对象的语言,Java语言是一个面向对象的语言,但是Java中的基本数据类型确实不面向对象的,但是我们在实际使用中经常需要将基本数据转化成对象,便于操作,比如:集合的操作中这时,我们就需要将基本类型数据转化成对象!   包装类均位于java.lang包,包装类和基本数据类型的对应关系   基本数据类型   包装类    byte          ...

KAKA的博客 1996

4、define和typedef在CPP中的一点使用小技巧

define IN//a为出入参数,b是要输出的参数b = a * 2;return b;这种情况,目前遇到的情况是定义函数指针变量//定义普通的函数指针类型int main()//存储对应的函数名(Func是上面使用typedef定义的变量),函数描述,函数id。

山间点烟雨 482

一点c++编程的小技巧

心得和技巧c++中,在vs编译环境下,如果你写得函数有声明,有定义,那么你通过F12按键可以直接查到原函数的定义处。如果不能则说明你的声明和定义不一致。 哪怕是很小的区别,如我写的函数。 声明是: void Compute_R_T_Ransac(double r[][3], double t[], const CvMat *HMatrix,const CvMat *bMatri

1126

dev c++一点技巧

谈谈dev c++使用上的一点技巧吧 dev c++就是这个东西,被广泛用于中学生竞赛……(一个因为界面丑而被指责数年的软件,也就可以打打noip和省选吧) 下面几个功能实际3分钟之内可以实现,却在比赛中让人舒服很多 第一步改为中文 Tools-Environment Options-Language-Chinese 显示如下 第二步在工具中找到编译选项,然后如下把...

dijueyi1887的博客 310

C++类中将成员函数设置为线程处理过程的一点使用技巧

C++类中只有静态成员函数才能设置为线程的处理过程函数,但是此时静态成员函数只能调用类的静态成员函数和方法,这对调用类中的方法和成员变量造成了很大的局限性。那么如何解决这个问题呢?下面介绍一种普遍使用的编程技巧! //.h文件 #ifndef CCONTROLMANAGER_H_ #define CCONTROLMANAGER_H_ #include"CManagerBase.h" cl...

paradox_1_0的博客 588

C/C++一点技巧:如何在控制台工程中使用CString类

在C/C++的开发工作中,我们经常会新建一个控制台工程来测试某个与界面无关的功能。

Workshop of Wenjie.Yin 2482

基本数据类型包装类(Wrapper Class)

定义 java并不是纯面向对象的语言,java语言是面向对象的语言,但java中的基本数据类型并不是面向对象的。 因此我们在实际使用中需要将基本数据转换为对象,便于操作。 比如:List &lt; Integer&gt; = new ArrayList&lt; Integer&gt; 这时,我们就将基本数据类型转换为对象; 基本数据类型对应的包装类,如图: 自动装箱和拆箱 装箱: Integer...

Eric_smxu的博客 790

设计模式C++实现:包装器外观模式(Wrapper Facade)

包装器外观模式(Wrapper Facade)把现有的非面向对象的API所提供的函数和数据,封装在更加简洁的、健壮的、可移植的、可维护的和内聚的面向对象的类接口中。 一般通过两种方式实现跨平台: 1.用类似#ifdef宏的条件编译。 2.目录分离。如每个操作系统平台有自己的目录,包含与平台有关的包装器外观的实现。可使用语言处理工具在编译时从相关的目录中包含合适的包装器外观的实现类。 类图如下

renyican的博客 3850

Wrapper Class 包装类

*What is Wrapper Class(包装类)? Java为8种数据类型分别定义的相应的引用类型,称之为基本数据数据的“包装类”。包括:Byte、Short、Integer、Long、Character、Float、Double、Boolean。这些类都继承自Object类。 *How to use Wrapper Class? 1. 通过构造器创建一个包装类对象,通过xxx

veshid的专栏 770

CSS 学习笔记 01 wrapper class

div内容居中 <!-- DESKTOP NAVIGATION --> <nav class="top-bar"> <div class="wrap"> <div class="top-bar-left"> <h3>site title</h3> </div> <div class="top-bar-ri

自构者的博客 907
上一篇: 王永庆给儿女的信[转]
下一篇: Poring to 64 bit
firePhoenix1981
博客等级 码龄20年 17粉丝 67原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值