转载自 link
降低编译依存关系的两种方法
很多大型c++项目如果编译的依存关系太复杂,则很有可能稍微修改一行代码就导致整个项目重新编译,这是很不友好的。
第一种方法是使用handle class
#pragma once
namespace data_structure {
template <class T>
class handle {
private:
T* ptr; // 句柄指向的指针
int* count; // 句柄引用计数器
public:
//构造函数
handle(T* ptr) : ptr(ptr), count(new int(1)) {}
// 拷贝构造函数
handle(const handle<T>& rhs) : ptr(rhs.ptr), count(&++*rhs.count) {}
//赋值函数
const handle<T>& operator=(const handle<T>& rhs) {
if (--*rhs.count == 0) delete ptr, count;
ptr = rhs.ptr;
count = &++*rhs.count;
return *this;
}
~handle() {
if (--*count == 0) delete ptr, count;
}
T& operator*() { return *ptr; }
T* operator->() { return ptr; }
const T& operator*() const { return *ptr; }
const T* operator->() const { return ptr; }
};
} // namespace data_structure
这就是一个简单的handle类,当然这个类并不能降低依存关系,因为他是一个模版类,所有的模版类都不能够被分离编译。但我们可以对专用的类构造一个专用的handle,即可实现分离编译。
第二种方法是使用interface class
这里不提供代码了,简单说就是使用基类制造存虚函数作为接口,实现多态。