我已经实现了一个基本的pImpl设置,基本上就是以下示例:Is the pImpl idiom really used in practice?。
我在网上找到的大多数pImple实现都从不显示任何方法示例。经验法则似乎是将所有私有成员/方法隐藏在该示例中。我遇到的问题是我有一个看起来像这样的公共方法:
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-> member看起来有点难看。您如何处理?
最佳答案
假设我正确解释了您的问题,即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。它在冗余代码和额外的参数复制以及粉刺数量之间取得了平衡。
但是,正如评论中所建议的那样,对于所有内容,或者至少对每个非平凡的函数使用选项B,可能会更清洁。
关于c++ - 惯用法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28908221/