将纯虚拟接口的实现放在cpp中并完全跳过头文件是一种好习惯吗?
A.h
struct A
{
virtual void func() = 0;
};
B.cpp
class B : public A
{
virtual void func() override {
...
}
}
将纯虚拟接口的实现放在cpp中并完全跳过头文件是一种好习惯吗?
A.h
struct A
{
virtual void func() = 0;
};
B.cpp
class B : public A
{
virtual void func() override {
...
}
}
必须有人使用该类B
,并且他们必须从某个地方获取 的实例,B
即使他们只通过A*
. 所以你可以有例如:
啊
struct A
{
virtual void func() = 0;
virtual ~A() {}
};
溴化氢
#include "A.h"
A *Bfactory();
B.cpp
#include "B.h"
struct B : public A { ... };
A *Bfactory() { return new B(); }
另一方面,这是一个相当“弱”的工厂函数,因为它只返回B
. 也许在某个地方会有另一个工厂函数A
根据其参数创建不同的派生类。该函数需要包含A.h
、B.h
等C.h
,但如果它总是用于Bfactory
创建 的实例,B
则不需要 . 的类定义B
。所以在这种情况下,类定义只存在于B.cpp
.
顺便说一句,我从工厂返回了一个原始指针。在现实生活中,您可能更喜欢返回一个unique_ptr
或其他智能指针。如果这样做,那么实际上可以避免在A
. 但我怀疑这通常是否值得。