将纯虚拟接口的实现放在cpp中并完全跳过头文件是不错的做法?
A.h
struct A
{
virtual void func() = 0;
};
B.cpp
class B : public A
{
virtual void func() override {
...
}
}
答案 0 :(得分:1)
有人必须使用类B
,他们必须从某个地方获取B
的实例,即使他们只是通过A*
来解决它们。所以你可以拥有例如:
A.H
struct A
{
virtual void func() = 0;
virtual ~A() {}
};
B.h
#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
中需要虚拟析构函数。但我怀疑它经常值得。