希望有人能给我提供一个思路:
赞自学 C++, 请问你 C 语言掌握得如何? 我觉得可以从 clang.csdn.net 入手。
C++ 主要是对面向对象的设计有帮助, 基本的工作,还是要从 C 语言开始学。
首先,我们需要定义一个类来表示对象池,包括以下内容:
对象池容量(C)
空闲链表的头索引(head)
后继数组(next)
对象数组(pool)
template <typename T>
class ObjectPool {
public:
explicit ObjectPool(size_t capacity)
: capacity_(capacity),
head_(1),
next_(capacity + 1),
pool_(capacity + 1) {}
~ObjectPool() = default;
private:
size_t capacity_;
int head_;
std::vector<int> next_;
std::vector<T> pool_;
};
然后,我们可以实现对象池的初始化函数,用于初始化空闲链表和后继数组。
template <typename T>
void ObjectPool<T>::Init() {
for (int i = 1; i < capacity_; ++i) {
next_[i] = i + 1;
}
next_[capacity_] = 0;
}
接下来,我们可以实现分配对象的函数:
template <typename T>
int ObjectPool<T>::New() {
if (head_ == 0) {
return 0;
}
int p = head_;
head_ = next_[head_];
return p;
}
对于引用对象的函数,我们可以这样实现:
template <typename T>
const T& ObjectPool<T>::Ref(int p) const {
if (p < 1 || p > capacity_) {
std::cerr << "error" << std::endl;
return pool_[0];
}
return pool_[p];
}
对于释放对象的函数,我们可以这样实现:
template <typename T>
void ObjectPool<T>::Delete(int p) {
if (p == 0) {
return;
}
if (p < 1 || p > capacity_) {
std::cerr << "error" << std::endl;
return;
}
next_[p] = head_;
head_ = p;
}
最后,我们可以实现查询空闲链表头索引的函数:
template <typename T>
int ObjectPool<T>::Head() const {
return head_;
}
完整的代码如下:
template <typename T>
class ObjectPool {
public:
explicit ObjectPool(size_t capacity)
: capacity_(capacity),
head_(1),
next_(capacity + 1),
pool_(capacity + 1) {}
~ObjectPool() = default;
void Init();
int New();
const T& Ref(int p) const;
void Delete(int p);
int Head() const;
private:
size_t capacity_;
int head_;
std::vector<int> next_;
std::vector<T> pool_;
};
template <typename T>
void ObjectPool<T>::Init() {
for (int i = 1; i < capacity_; ++i) {
next_[i] = i + 1;
}
next_[capacity_] = 0;
}
template <typename T>
int ObjectPool<T>::New() {
if (head_ == 0) {
return 0;
}
int p = head_;
head_ = next_[head_];
return p;
}
template <typename T>
const T& ObjectPool<T>::Ref(int p) const {
if (p < 1 || p > capacity_) {
std::cerr << "error" << std::endl;
return pool_[0];
}