C++ 嵌套类 实现与接口的关系 实现

实现(Implementation)与接口(Interface)的关系。
这种设计模式在C++中被称为Pimpl(Pointer to Implementation)习惯用法或编译器防火墙。

下面我将使用例子 MyClass::Impl 这种嵌套类的写法是一种改进的 Pimpl 习惯用法。这种方法将实现类 Impl 嵌套在接口类 MyClass 中,不仅可以封装实现细节,还能更直观地表达 ImplMyClass 的私有实现部分。这种方式通常被称为 “Pimpl Idiom with Nested Class”。

使用嵌套类的 Pimpl 习惯用法示例

1. 定义接口类 MyClass

在这个版本中,Impl 类被嵌套定义在 MyClass 中。

MyClass.h

#ifndef MYCLASS_H
#define MYCLASS_H

#include <memory>

class MyClass {
public:
    MyClass();
    ~MyClass();

    void doSomething();

private:
    class Impl;                    // 前向声明嵌套类
    std::unique_ptr<Impl> pImpl;   // 指向实现类的指针
};

#endif // MYCLASS_H
2. 实现嵌套类 MyClass::Impl

嵌套类 Impl 的定义通常放在源文件中,以隐藏实现细节。

MyClass.cpp

#include "MyClass.h"
#include <iostream>

// 实现类的定义
class MyClass::Impl {
public:
    void doSomethingImpl() {
        std::cout << "Doing something in the nested implementation class!" << std::endl;
    }
};

// 构造函数:初始化嵌套实现类的指针
MyClass::MyClass() : pImpl(std::make_unique<Impl>()) {}

// 析构函数:析构指针自动调用 Impl 的析构函数
MyClass::~MyClass() = default;

// 通过接口调用嵌套实现类的方法
void MyClass::doSomething() {
    pImpl->doSomethingImpl();
}

代码解释

  1. 嵌套类 (MyClass::Impl): 实现类 Impl 被嵌套定义在接口类 MyClass 中,这表示 ImplMyClass 的私有实现。嵌套类的声明放在 MyClass.h 中,但其定义通常在 MyClass.cpp 中完成,以隐藏实现细节。

  2. 前向声明: 在 MyClass.h 中,我们仅对嵌套类 Impl 进行前向声明。这使得外部代码无法访问 Impl 的细节,同时减少了编译时间。

  3. 封装实现细节: 使用这种方法,所有实现细节都被封装在 Impl 中,并且只能通过 MyClass 的接口进行访问。

  4. 使用智能指针: 我们使用 std::unique_ptr 来管理 Impl 的生命周期,这样可以自动处理资源释放,避免内存泄漏。

这种嵌套类的 Pimpl 习惯用法保持了原有 Pimpl 模式的优点,还增加了代码的组织性和可读性,使实现细节与接口清晰分离。


类的关系分析

在上面代码示例中,doSomethingImplMyClass::Impl 的方法,而不是 MyClass 的方法。它们的具体关系如下:

  • MyClass::Impl: 这是一个嵌套类,专门用于实现 MyClass 的具体功能。doSomethingImplImpl 类中的一个成员函数,负责实现 MyClass 的功能逻辑。

  • MyClass: 这是公共接口类,提供外部可访问的接口。doSomethingMyClass 的一个公开方法,它在内部调用了 pImpl->doSomethingImpl(),其中 pImpl 是指向 Impl 对象的智能指针。

关键点

  • doSomethingImplMyClass::Impl 的成员函数,只能由 Impl 对象调用。
  • MyClass 通过 pImpl 这个指针对象来调用 Impl 的方法(如 doSomethingImpl),以实现外部接口方法(如 doSomething)。

这种设计使得 MyClass 的实现细节被完全隐藏在 Impl 中,对外只暴露 MyClass 的接口,这也是 Pimpl 习惯用法的核心思想。

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值