假设我有一个Squad
带有Unit
s 动态数组的类。我正在寻找一种方法来避免将#include
“Unit.h”插入“Squad.h”和后者的用户。全球的想法是避免#include
s 导致其他人 - 这是一件非常烦人的事情。
我找到了一个像这样的简单解决方案:
// Squad.h
class Unit;
class Squad {
private:
Unit* units;
size_t units_num;
public:
void do_something_with_units(); // its implementation requires Unit to be a full type
};
// Squad.cpp
#include "Unit.h" // it's fine (and required) in Squad.cpp
void Squad::do_something_with_units() { // implements
}
// squad_user.h
// I want this whole file to be satisfied with only
// a forward-declaration of Unit (coming from Squad.h)
// provided it doesn't interact with Unit directly
void foo() {
Squad squad;
squad.do_something_with_units(); // works!
}
(将前向声明Unit
的 s 放在std::vector
里面Squad
会失败,因为它需要自己Squad
的用户#include
Unit
,否则vector
无法分配。)
问题一:这种做法可以接受吗?当然,我不会std::vector
每次都重写(和其他人)的胆量,但是使用.cpp 中的template<typename T> T* reallocate(T*, size_t current, size_t needed)
for later s 之类的算法制作标题似乎是可以忍受的。#include
问题二:有更好的解决方案吗?我知道 pimpl 习惯用法,但不喜欢频繁的小堆分配。
顺便说一句,当我需要像 std::unordered_map 这样更复杂的数据结构时,我该怎么办?更换一个数组并不难,但也有像这样的“更糟糕”的情况。