Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.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
为什么我们在pimpl中使用“new”? 我在看如何在C++中使用piml,我在教程中找到了这段代码: // In MyClass.h class MyClassImp; // forward declaration of Pimpl class MyClass { public: MyClass (); ~MyClass(); MyClass( const MyClass &rhs ); // undefined for simplicity MyClass& operator=( MyClass ); void Public_Method(); private: MyClassImp *pimpl_; // the Pimpl }; // In MyClass.cpp #include "MyClass.h" class MyClassImp { public: void Private_Method() {} // dummy private function int private_var_; // a private variable }; MyClass::MyClass() : pimpl_( new MyClassImp() ) { } MyClass::~MyClass() { delete pimpl_; } void MyClass::Public_Method() { pimpl_->Private_Method(); // do some private work pimpl_->private_var_ = 3; }_C++ - Fatal编程技术网

为什么我们在pimpl中使用“new”? 我在看如何在C++中使用piml,我在教程中找到了这段代码: // In MyClass.h class MyClassImp; // forward declaration of Pimpl class MyClass { public: MyClass (); ~MyClass(); MyClass( const MyClass &rhs ); // undefined for simplicity MyClass& operator=( MyClass ); void Public_Method(); private: MyClassImp *pimpl_; // the Pimpl }; // In MyClass.cpp #include "MyClass.h" class MyClassImp { public: void Private_Method() {} // dummy private function int private_var_; // a private variable }; MyClass::MyClass() : pimpl_( new MyClassImp() ) { } MyClass::~MyClass() { delete pimpl_; } void MyClass::Public_Method() { pimpl_->Private_Method(); // do some private work pimpl_->private_var_ = 3; }

为什么我们在pimpl中使用“new”? 我在看如何在C++中使用piml,我在教程中找到了这段代码: // In MyClass.h class MyClassImp; // forward declaration of Pimpl class MyClass { public: MyClass (); ~MyClass(); MyClass( const MyClass &rhs ); // undefined for simplicity MyClass& operator=( MyClass ); void Public_Method(); private: MyClassImp *pimpl_; // the Pimpl }; // In MyClass.cpp #include "MyClass.h" class MyClassImp { public: void Private_Method() {} // dummy private function int private_var_; // a private variable }; MyClass::MyClass() : pimpl_( new MyClassImp() ) { } MyClass::~MyClass() { delete pimpl_; } void MyClass::Public_Method() { pimpl_->Private_Method(); // do some private work pimpl_->private_var_ = 3; },c++,C++,但是我无法理解在堆中分配MyClassMP的原因,我们不能只在堆栈上使用一个变量吗 澄清: 如果我们将MyClassMP放在一个单独的.h和.cpp文件中,并将.h包含在MyClass.h中,然后使用MyClassMP pimpl;如果没有指针,它不会达到同样的效果吗?当MyClassMP的实现发生更改时,调用方MyClass不需要更改和重新编译。他们仍然需要重新链接由于指针的原因,您需要重新链接。指针存在,因此您可以向前声明,即不包括Impl的定义。如果在头文件中包含Impl的定义,那么就可以

但是我无法理解在堆中分配MyClassMP的原因,我们不能只在堆栈上使用一个变量吗

澄清:


如果我们将MyClassMP放在一个单独的.h和.cpp文件中,并将.h包含在MyClass.h中,然后使用MyClassMP pimpl;如果没有指针,它不会达到同样的效果吗?当MyClassMP的实现发生更改时,调用方MyClass不需要更改和重新编译。他们仍然需要重新链接

由于指针的原因,您需要重新链接。指针存在,因此您可以向前声明,即不包括Impl的定义。如果在头文件中包含Impl的定义,那么就可以将其公开给包含它的任何文件。

pimpl习惯用法的诀窍是,在头文件中只使用指针。这意味着您可以使用类的前向声明,而无需实际提供声明

因此,您以后可能会在cpp中更改声明,而不会影响标头或使用标头的其他编译单元


这在处理库时特别有用。

基本问题是,为了将impl放在堆栈上,代码需要知道调用站点的impl类的大小,这意味着必须公开impl的类定义。impl的全部目的是隐藏类定义。

哪个堆栈?MyClass::MyClass中的一个?一旦构造函数完成,它就会被销毁。打电话的人是谁?你不认识打电话的人。你是在问为什么你必须要有MyClassImp*pimpl;而不是MyClassImp pimpl?要在堆栈上寻址-您希望在哪个函数调用的堆栈框架内进行寻址?为了解决为什么不使用自动存储持续时间的问题,本练习的重点是隐藏MyClassImp的定义。如果它是一个直接成员,则需要知道它的大小和定义。如果使用堆栈变量,则编译器需要知道它的大小,即整个定义。使用指针,您只需执行正向声明,编译器就不需要知道它的实际结构。这其中可能不涉及堆栈,例如,如果代码是MyClass*p=new MyClass;。如果我们简单地使用MyClassMP pimpl\并将MyClassMP放在一个单独的文件中,将MyClassMP.h包含在MyClass.h中,那么最好在代码中显示您想要的替代方案,当MyClassMP发生更改时,MyClass.h不需要重新编译,对吗?只要您只更改MyClassMP的实现,是-但是如果同时更改Interface=header,则需要重新编译。有了指针,你完全可以自由地做任何你想做的事情,因为你甚至不包括MyClassImp.h