将纯虚拟接口(interface)的实现放在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() {}
};
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
中对虚拟析构函数的需要。但我怀疑这通常是否值得。
关于c++ - cpp文件中的纯虚接口(interface)实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13891394/