2

将纯虚拟接口的实现放在cpp中并完全跳过头文件是一种好习惯吗?

A.h
struct A
{
    virtual void func() = 0;
};
B.cpp
class B : public A
{
   virtual void func() override {
   ...
   }
}
4

1 回答 1

1

必须有人使用该类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.hB.hC.h,但如果它总是用于Bfactory创建 的实例,B则不需要 . 的类定义B。所以在这种情况下,类定义只存在于B.cpp.

顺便说一句,我从工厂返回了一个原始指针。在现实生活中,您可能更喜欢返回一个unique_ptr或其他智能指针。如果这样做,那么实际上可以避免在A. 但我怀疑这通常是否值得。

于 2012-12-15T10:45:45.463 回答