0

I have following third-party class(just wrapper around some pointer):

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

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

I want to modify A's interface: disable some methods, add some new, while hiding its implementation details. I decided to do following:

// 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();
}
...

Is it ok to do so? Maybe there is better solution? I want to change A interface because it doesn't fit my needs and don't want to keep it in my own code.

4

1 回答 1

1

在评论中你说

我不想分配 A 并持有 A* pImpl,因为它已经是某个指针 (AImpl) 的包装器

尽管有这个要求,你还是ANewA::newMethodOfA(). 这应该以什么方式比分配A一次并重新使用它更好?您的解决方案不好,因为 1)您A一遍又一遍地创建一个新的临时对象,以及 2)您强迫用户NewA提供一个实例A而不是自己创建一个实例。

我建议你咬紧牙关,在 PIMPL 之上进行适当的“PIMPL”实施(正如 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. 你不想a.h包含在new_a.h
  2. 你想提供一个修改过的界面,A这样用户NewA就不会知道任何关于AAImpl
  3. 你想隐藏执行A

唯一不完全符合的是,在代码中,您显示了A将其成员初始化pImpl为 0 的默认构造函数——这很奇怪!从什么时候开始需要 PIMPL 类的用户提供由 PIMPL 类包装的对象?参照。维基百科的不透明指针文章

于 2013-07-03T20:32:17.193 回答