Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;嵌套类-将实现移动到不同的文件_C++_Implementation_Pimpl Idiom - Fatal编程技术网

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

C++ C++;嵌套类-将实现移动到不同的文件,c++,implementation,pimpl-idiom,C++,Implementation,Pimpl Idiom,我试图学习如何使用PIMPL习惯用法,因为它减少了编译依赖性,我听说这是推荐的。所以我的代码基本上是这样的 福安 但是现在我想在一个单独的.cpp文件中定义FooImpl::FooImpl(),就像我在Foo::Foo()中所做的那样,但是我该怎么做呢 EDIT:我已经移动了一些东西来获取下面的代码,但是现在初始化impl会给我一个不完整的类型编译错误 福安 FooImpl.cpp #include "Foo.h" class Foo::FooImpl { public: FooImp

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

福安

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

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

福安

FooImpl.cpp

#include "Foo.h"

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

new运算符必须知道所分配对象的大小,因此完整的FooImpl类声明必须可用于包含Foo构造函数的CPP文件,因为它使用“newfooimpl”

但是现在我想在一个单独的.cpp中定义FooImpl::FooImpl()

丘疹习语的思想是隐藏实现。有人这样做过

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

因此,您已经实现了pimple可以提供的减少依赖性的度量


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

我的解决方案是将FooImp的定义留在Foo类中

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

我是这样工作的:

福安

FooImp.cpp

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

它编译得很好。

您是否尝试过编写
FooImpl.h
(其中必须包括
Foo.h
)和
FooImpl.cpp
,并在
FooImpl.cpp
中包含
FooImpl.h
?PIMPL的思想是,当实现
FooImpl.cpp
发生更改时,客户端不必重新编译
FooImpl.cpp
。请参见此处的示例:@vsoftco这就是我的代码。它减少了编译时依赖性对于包含Foo.h的文件,例如main.cpp,但在该示例和我的代码中,
FooImpl
的定义被约束为Foo.cpp,我想将其移动到FooImpl。cpp@TonyD,我的意思是使用
Foo.cpp
的客户不必重新编译(自己),希望我可以编辑我的评论:)@rcplus“我的代码就是这样的”/“在我的代码中,FooImpl的定义被约束为Foo.cpp,我想将其移动到FooImpl.cpp”-不能两者都是真的。。。vsoftco建议您将FooImpl的实现转移到它自己的FooImpl.cpp中-什么阻止了您?如果你不知道怎么做,用你当前代码的更新来编辑你的问题。
class Foo
{
public:
    Foo();
private:
    class FooImpl;
    std::unique_ptr<FooImpl> impl;
}
#include "Foo.h"

Foo::Foo():
impl(new FooImpl)
{
}
#include "Foo.h"

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

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

private: // member variable
    std::unique_ptr<FooImpl> impl;
};
#include "Foo.h"
Foo::Foo()
{
}
Foo::~Foo()
{
}
#include "Foo.h"
Foo::FooImp::FooImp()
{
}
Foo::FooImp::~FooImp()
{
}