簡體   English   中英

C++ 內部助手類

[英]c++ internal helper class

我想問一下關於 C++ 中的內部助手類的問題。 構建此結構的最佳方法是什么?

讓我通過示例闡明內部幫助程序類的含義。

// MyClass.h
class MyClass
{
    int myData;
    bool isSomething;
    ...
public:
    void DoSomething();
};

// MyClass.cpp
// This is what I mean by internal helper function. Helper function that's only visible int the implementation file (.cpp) but requires access to the private members of the class.
static void DoSomethingInternal( MyClass *myClass )
{
   // Access myClass private members
}

void MyClass::DoSomething()
{
    ...
    DoSomethingInternal(this);
    ...
}

我知道聲明朋友函數可以是一個解決方案。 然而,它使類聲明變得丑陋。 另外,對於每一個新的輔助函數,我都必須添加一個友元函數。

有這方面的習慣用法/設計模式嗎? 我一直在互聯網上搜索,但沒有找到任何。

先感謝您。 非常感謝您的回答。

根據我的經驗,許多開發團隊對靜態本地輔助函數沒有任何問題,它有助於減少標題膨脹,有助於保持正式公開的界面更小,等等。 它的優點是輕量級,缺點是如果您使用大量私有成員且沒有訪問器,則可能導致朋友膨脹/污染。

但是在討論社區中,它通常不贊成以下內容。

  • 將助手聲明為私有成員函數。

這具有將 fn _doThingsForFoo(Foo*)Foo明確關聯的優點,並使您免於暴露私有成員的許多麻煩。

它的缺點是基本上向需要#include您的標題的每個人展示您的內衣。

  • 使用 Pimpl 成語。

您聲明了第二個類,即“私有實現”( https://en.wikipedia.org/wiki/Opaque_pointer,pImpl 習語真的在實踐中使用了嗎? ),然后將所有您不想要的私有內容放入主標題到那個。

它的優點是允許你隱藏你的東西,它的缺點是添加一個額外的指針來饋送、存儲和遍歷(哦,免費)。

有幾種方法可以實現這一點。

  1. 如果輔助函數不需要直接訪問數據,請在 .cpp 文件中使用輔助類/函數。 我會在下一個方法之前推薦這種方法。

    在 .cpp 文件中:

     // Create a namespace that is unique to the file namespace MyClassNS { namespace HelperAPI { void DoSomethingInternal(MyClass* obj) { ... } } } using namespace MyClassNS; void MyClass::DoSomething() { ... // HelperAPI::DoSomethingInternal(this); ... }
  2. 使用疙瘩成語 使用這個習慣用法時,您可以在私有數據類中添加任意數量的輔助函數,而無需觸及該類的公共接口。

設計模式很簡單: 不要使用輔助類 如果一個類應該做某事,讓它自己做。

根據 StenSoft 給出的贊成答案,您應該在類中實現這些方法。 但是,如果由於某種原因這不是一個選項,那么請使用助手。 如果這不是一個選項,那么使用反射。 如果這不是一個選項,那么在您的類中使用命令偵聽器。 如果這不是一個選項,那么觀看教程。

為此,您可以閱讀以下網站PIMPL不透明指針 有了這個,你只需要一個成員變量,你就可以把所有私有的東西放到私有類中。

你的標題:

class PrivateClass;

class Class
{
public:
    // ...

private:
    PrivateClass* m_Private;
};

你的消息來源:

class PrivateClass
{
// ...
};

Class::Class
: m_Private( new PrivateClass )
{
// ...
}

更新:我忘了告訴提及刪除析構函數中的私有成員。

Class::~Class
{
    delete m_Private;
// ...
}

// ...

暫無
暫無

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

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