簡體   English   中英

慣用法

[英]pImpl idiom methods

我已經實現了一個基本的pImpl設置,基本上就是這個示例: pImpl習慣用法是否真的在實踐中使用?

我在網上找到的大多數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,可能會更清潔。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM