习语方法
pImpl idiom methods
我已经实现了一个基本的 pImpl 设置,基本上就是这个例子:Is the pImpl idiom really used in practice?。
我在网上找到的大多数 pImple 实现从不显示任何方法示例。经验法则似乎是在 pImple 中隐藏所有私有 members/methods。我 运行 遇到的问题是我有一个 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->member 似乎有点难看。你怎么看这个?
假设我正确地解释了您的问题,即 Foo
是 public class 而 Bar
是 public 方法。你有两个选择。选项 A 是:
void Foo::Bar() // Foo is the public class
{
pImpl->baz = 5;
}
选项 B 是:
void Foo::Bar() { pImpl->Bar(); }
其中 Impl class 包含:
void Impl::Bar() { baz = 5; }
我不确定是否有关于在两者之间进行选择的任何已发布指南。在我自己的代码中,我将选项 A 用于简单的方法,而选项 B 一旦开始进入似乎到处都是粉刺的阶段。是冗余代码和额外参数复制之间的平衡,疙瘩丰富。
但是,正如评论中所建议的那样,对所有内容或至少对每个重要函数使用选项 B 可能会更清晰。
我已经实现了一个基本的 pImpl 设置,基本上就是这个例子:Is the pImpl idiom really used in practice?。
我在网上找到的大多数 pImple 实现从不显示任何方法示例。经验法则似乎是在 pImple 中隐藏所有私有 members/methods。我 运行 遇到的问题是我有一个 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->member 似乎有点难看。你怎么看这个?
假设我正确地解释了您的问题,即 Foo
是 public class 而 Bar
是 public 方法。你有两个选择。选项 A 是:
void Foo::Bar() // Foo is the public class
{
pImpl->baz = 5;
}
选项 B 是:
void Foo::Bar() { pImpl->Bar(); }
其中 Impl class 包含:
void Impl::Bar() { baz = 5; }
我不确定是否有关于在两者之间进行选择的任何已发布指南。在我自己的代码中,我将选项 A 用于简单的方法,而选项 B 一旦开始进入似乎到处都是粉刺的阶段。是冗余代码和额外参数复制之间的平衡,疙瘩丰富。
但是,正如评论中所建议的那样,对所有内容或至少对每个重要函数使用选项 B 可能会更清晰。