gpt4 book ai didi

c++ - 是否可以用 C++ 编写敏捷的 Pimpl?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:05:32 25 4
gpt4 key购买 nike

我一直在玩弄 Pimpl 惯用法,并从中获益匪浅。唯一不太热衷的是定义函数时的感觉。

  • 一次在标题中(P def)
  • 一旦在 .cpp 的顶部(Impl def)
  • 一次在.cpp的中间(Impl Impl)
  • 一次在 .cpp (P Impl) 的低端

我真的很喜欢减少代码差异和冗余,当我不得不在当前项目中添加或更改功能时,即使是相对复杂的 Impls,我也觉得我的代码不够流畅。

我的问题是,有什么有效的方法可以暗示或模板化我的类,如果我要定义一个新函数,我只需要编写一个明确的定义和实现,其余的都保留在空间上接近代码中的显式;如果我要改变一个功能,必要的改变会尽可能少吗?

最佳答案

您可能会按照以下思路考虑:

一个接口(interface)类,用于最小化重复声明。客户端将在其代码中使用 PublicImplementation 类。

Pimpl.h

#ifndef PIMPL_H_
#define PIMPL_H_

#include <memory> // std::unique_ptr

class Interface
{
public:
virtual ~Interface() {}

virtual void func_a() = 0;
virtual void func_b() = 0;
};

class PublicImplementation
{
// smart pointer provides exception safety
std::unique_ptr<Interface> impl;

public:
PublicImplementation();

// pass-through invoker
Interface* operator->() { return impl.get(); }
};

#endif // PIMPL_H_

Pimpl.cpp

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

class PrivateImplementation
: public Interface
{
public:

void func_a() override { std::cout << "a" << '\n'; }
void func_b() override { std::cout << "b" << '\n'; }
};

PublicImplementation::PublicImplementation()
: impl(new PrivateImplementation)
{
}

最后这是客户端代码所做的:

main.cpp

#include "Pimpl.h"

int main()
{
PublicImplementation pi; // not a pointer

pi->func_a(); // pointer semantics
pi->func_b();
}

关于c++ - 是否可以用 C++ 编写敏捷的 Pimpl?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24635255/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com