C++ 嵌套 class - 将实现移动到不同的文件

C++ nested class - moving implementation to different file

我正在尝试学习如何使用 PIMPL 习惯用法,因为它减少了编译依赖性,我听说这是推荐的。所以我的代码基本上看起来像这样。

Foo.h

class Foo
{
public:
    Foo();
private:
    class FooImpl;
    std::unique_ptr<FooImpl> impl;
}

Foo.cpp

Foo::Foo():
impl(new FooImpl)
{
}

class Foo::FooImpl
{
public:
    FooImpl();
}

但现在我想在单独的 .cpp 文件中定义 FooImpl::FooImpl(),就像我在 Foo::Foo() 中所做的那样,但我该怎么做呢?

编辑:我已经移动了一些东西以获得下面的代码,但现在初始化 impl 给我一个不完整的类型编译错误。

Foo.h

class Foo
{
public:
    Foo();
private:
    class FooImpl;
    std::unique_ptr<FooImpl> impl;
}

Foo.cpp

#include "Foo.h"

Foo::Foo():
impl(new FooImpl)
{
}

FooImpl.cpp

#include "Foo.h"

class Foo::FooImpl
{
public:
    FooImpl();
}

operator new 必须知道被分配对象的大小,所以你完整的 FooImpl class 声明必须对包含 Foo 的构造函数的 CPP 文件可用,因为它使用 "new FooImpl".

But now I want to define FooImpl::FooImpl() in a seperate .cpp

疙瘩成语的思想是隐藏实现。在那里做过。

但是,如果 FooImpl class 包含在 Foo.cpp 文件中(并且仅包含在该文件中),那么它已经相当好地隐藏了。 (大多数 C++ 开发人员会努力避免包含 .cpp 文件。

因此,您已经达到了粉刺可以提供的减少依赖性的措施。

在为自己做更多工作之前,尝试实现 class Foo 的两个或三个方法,然后发现如何在引入第三个文件之前将它们连接到 Foo.cpp 文件中的 FooImpl。

我的解决方案是在 Foo 中保留 FooImp 的定义 class。

所有 class 成员都在那里。然后 FooImp.cpp 包含 Foo.h 并实现所有非内联函数。

我是这样工作的:

Foo.h

class Foo
{
public: // ctor & dtor
    Foo();
    ~Foo();

private: // nested class
    class FooImp
    {
    public:
        FooImp();
        ~FooImp();
    };

private: // member variable
    std::unique_ptr<FooImpl> impl;
};

Foo.cpp

#include "Foo.h"
Foo::Foo()
{
}
Foo::~Foo()
{
}

FooImp.cpp

#include "Foo.h"
Foo::FooImp::FooImp()
{
}
Foo::FooImp::~FooImp()
{
}

编译正常。