FFmpeg是纯C语法的,内部结构体内存分配和释放需要调用专门的函数,比如avformat_alloc_context,avformat_free_context等。使用起来不太方便,如果调用的时候忘记了一一对应的,很容易造成内存泄漏。 因此用C++的模板把ffmpeg中的内存分配进行了封装。下面的例子只是对AVFormatContext, AVCodecContext进行了封装,其他结构体封装起来也很方便,只需重载FFmpegPtrTraits类就可以。 template<typename T> class FFmpegPtrTraits; template& […]
有时候需要将数据的存储和访问分别放到不同对象中,这时就可以使用访问者模式: class MultiThreadVector { std::vector<int> mArray; std::mutex mMtx; public: class Accessor { MultiThreadVector &mData; std::unique_lock<std::mutex> mGuard; public: Accessor(MultiThreadVector &data) : mData(data), mGuard(data.mMtx) { } void pu […]
动态链接库的使用有两种方式,一种是在编译的时候就把动态链接库的头文件包含起来,链接的时候,系统自动去查找需要的动态链接库;另一种是程序动态的去加载,windows下是使用LoadLibrary加载库文件,然后通过GetProcAddress获取函数指针;在linux下是使用dlopen加载库文件,然后通过dlsym获取函数指针。但是动态加载的方式,需要在调用的地方定义很多函数指针,使用起来不太方便,而且动态链接库改了接口,使用的地方也需要相应的修改。有没有更好的方法呢?当然有,可以利用可变参数模板来改善动态加载链接库的使用。 windows […]
GoF中的观察者模式,是设计中经常使用的模式。 #include<list> class Subject; class Observer { public: virtual ~Observer(); virtual void Update(Subject* changedSubject) = 0; protected: Observer(); }; class Subject { public: virtual ~Subject(); virtual void Attach(Observer *); virtual void Detach( […]
面向对象编程,类设计的好坏,对程序非常重要。类设计的合理,以后修改程序和扩展程序的功能有很大的帮助。遵守下面几个原则,有利于设计出合理的类。 1. 单一职责原则(Single Responsibility Principle) 每个类应该只有一个职责(A class should only have a Single responsibility),如果一个类承担的职责过多,就等于把这些职责耦合在一起,一个职责的变化可能会削弱或者抑制这个类完成其他职责的能力。这种耦合会导致脆弱的设计,当变化发生时,设计会遭到意想不到的破坏。 假设有一个报表类,现在有两个方法,一个显示报表,一个保存报表。 cl […]
如何才能设计出一个使用方便,不容易出错的类,下面的问题能帮助我们在设计类的时候,考虑的更加全面一些。 1. 类需要一个构造函数吗? 2. 数据成员是私有的吗? 3. 类需要一个无参的构造函数吗? 4. 是不是每个构造函数初始化所有的数据成员? 5. 类需要析构函数吗? 6. 类需要一个虚析构函数吗? 7. 类需要复制构造函数吗? 8. 类需要一个赋值操作符吗? 9. 赋值操作父能正确将对象赋给对象本省吗? 10. 类需要定义关系操作符吗? 11. 删除数组时记住用了delete[ ]吗? 12. 复制购置函数和赋值操作符的参数类型中加了const吗? 13. 如果函数有应用参数,它们应该是co […]