Pimpl(Pointer to Implementation)惯用法是一种常见的C++编程技巧,用于隐藏类的实现细节,从而减少编译依赖和提高编译速度。要将Pimpl实例从子实例传递到父实例,你需要确保父类和子类都使用Pimpl惯用法,并且在子类中正确地初始化和传递Pimpl实例。
以下是一个示例,展示如何在父类和子类中使用Pimpl惯用法,并在子类中传递Pimpl实例到父类。
首先,定义父类和子类的接口。父类的接口应该是纯虚函数,以便子类可以实现它们。
// Parent.h
#ifndef PARENT_H
#define PARENT_H
#include <memory>
class Parent {
public:
virtual ~Parent();
virtual void doSomething() = 0;
protected:
Parent();
private:
class Impl;
std::unique_ptr<Impl> pImpl;
};
#endif // PARENT_H
// Child.h
#ifndef CHILD_H
#define CHILD_H
#include "Parent.h"
class Child : public Parent {
public:
Child();
~Child();
void doSomething() override;
private:
class Impl;
std::unique_ptr<Impl> pImpl;
};
#endif // CHILD_H
接下来,实现父类和子类的实现细节。父类的实现细节应该包含一个指向子类实现细节的指针,以便在子类中传递Pimpl实例。
// Parent.cpp
#include "Parent.h"
#include <iostream>
class Parent::Impl {
public:
virtual ~Impl() = default;
virtual void doSomething() = 0;
};
Parent::Parent() : pImpl(nullptr) {}
Parent::~Parent() = default;
// Child.cpp
#include "Child.h"
#include <iostream>
class Child::Impl : public Parent::Impl {
public:
void doSomething() override {
std::cout << "Child is doing something!" << std::endl;
}
};
Child::Child() : pImpl(std::make_unique<Impl>()) {
// 将子类的Pimpl实例传递给父类
Parent::pImpl = std::move(pImpl);
}
Child::~Child() = default;
void Child::doSomething() {
pImpl->doSomething();
}
最后,编写一个简单的程序来使用父类和子类。
// main.cpp
#include "Child.h"
int main() {
Child child;
child.doSomething();
return 0;
}
Parent.h
和 Child.h
中定义了父类和子类的接口。父类的接口包含一个纯虚函数 doSomething
,子类实现了这个函数。Parent.cpp
和 Child.cpp
中实现了父类和子类的实现细节。父类的实现细节包含一个指向子类实现细节的指针 pImpl
。main.cpp
中创建子类实例并调用 doSomething
函数。领取专属 10元无门槛券
手把手带您无忧上云