gpt4 book ai didi

c++ - 通过内部指针隐藏实现细节

转载 作者:行者123 更新时间:2023-11-28 07:32:05 25 4
gpt4 key购买 nike

我有以下第三方类(只是包装一些指针):

// a.h
class AImpl;
class A
{
AImpl* pImpl;

public:
A(): pImpl(0) {}
A(AImpl* ptr): pImpl(ptr) {}
...
AImpl* getImpl() const { return pImpl; }
...
void someMethodOfA();
};

我想修改A 的接口(interface):禁用一些方法,添加一些新方法,同时隐藏其实现细节。我决定执行以下操作:

// new_a.h
class AImpl;
class A;

class NewA
{
AImpl* pImpl;

public:
NewA( const A& a );
...
void newMethodOfA();
...
};

//new_a.cpp
#include "a.h"
NewA::NewA( const A& a ): pImpl( a.getImpl() ) {}
...
void NewA::newMethodOfA()
{
A( pImpl ).someMethodOfA();
}
...

这样做可以吗?也许有更好的解决方案?我想更改 A 接口(interface),因为它不符合我的需求并且不想将其保留在我自己的代码中。

最佳答案

在评论中你这么说

I don't want to allocate A and hold A* pImpl, because it's already a wrapper around some pointer (AImpl)

尽管有此要求,您还是在 NewA::newMethodOfA() 中分配了一个临时的 A 对象。这应该比分配 A 一次并重新使用它更好吗?您的解决方案不好,因为 1) 您一遍又一遍地创建一个新的临时 A,并且 2) 您强制 NewA 的用户提供 的实例A 而不是自己创建一个。

我建议您硬着头皮做一个适当的“PIMPL on top of PIMPL”实现(正如 Captain Obvlious 所说):

// new_a.h
class A;

class NewA
{
A* pImpl;

public:
NewA();
~NewA();

void newMethodOfA();
};

//new_a.cpp
#include "a.h"
NewA::NewA() : pImpl( new A() ) {}
NewA::~NewA() { delete pImpl; }

void NewA::newMethodOfA()
{
pImpl->someMethodOfA();
}

这满足您的所有其他要求:

  1. 您不想在 new_a.h 中包含 a.h
  2. 您想提供一个修改过的A 接口(interface),这样NewA 的用户就不会知道AAImpl
  3. 您想隐藏A的实现

唯一不完全符合的是,在您显示的代码中,A 的默认构造函数将其 pImpl 成员初始化为 0 - 这很奇怪!从什么时候起 PIMPL 类的用户需要提供由 PIMPL 类包装的对象?比照。维基百科的Opaque Pointer article .

关于c++ - 通过内部指针隐藏实现细节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17455822/

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