pImpl成语方法

时间:2015-03-06 21:45:54

标签: c++ pimpl-idiom

我已经实现了一个基本的pImpl设置,基本上就是这个例子:Is the pImpl idiom really used in practice?

我在网上找到的大多数pImple实现都没有显示任何方法示例。经验法则似乎是隐藏pImple中的所有私有成员/方法。我遇到的问题是我有一个 public 方法看起来像这样:

bool Foo::Bar(const void* data, size_t size)
{
    if( size > 0 )
    {
        if(data == nullptr)
            return false;

        size_t newSize = m_size + size;
        if ( newSize > m_capacity )
        {
            m_capacity = GROW_FACTOR*newSize;
            void* newMem = Malloc(m_capacity);

            if ( m_size > 0 )
                ::memcpy(newMem, m_data, m_size);

            if ( m_data )
                Free(m_data);

            m_data = (char*)newMem;
        }
        ::memcpy(m_data + m_size, data, size);
        m_size += size;
    }
    return true;
}

这应该在pImpl吗?如果没有,那么每隔几个字就把pImpl->成员看起来有点难看。你是怎么做到的?

1 个答案:

答案 0 :(得分:2)

假设我正确地解释了您的问题,即Foo是公共类,Bar是公共方法。你有两个选择。选项A是:

void Foo::Bar()  // Foo is the public class
{
    pImpl->baz = 5;
}

和选项B是:

void Foo::Bar() { pImpl->Bar(); }

Impl类包含:

void Impl::Bar() { baz = 5; }

我不确定是否有关于两者之间选择的公布指南。在我自己的代码中,我使用选项A用于简单方法和选项B一旦它开始进入阶段,似乎到处都有粉刺。它是冗余代码和额外参数复制以及疙瘩丰度之间的平衡。

然而,正如评论中所建议的那样,将选项B用于所有事情,或者至少是每个非平凡的功能,也许更为清晰。