2013-10-31 28 views
1

在VS中,當你鍵入「class」。您將看到可以調用的功能列表。必須查看15-20個函數的列表,其中一半或更多的成員是不好的。VS2012 - 類接口設計:私人成員功能定位/隱藏

我非常有興趣找到一個隱藏私有成員函數或將它們移動到列表末尾的系統,因此用戶不必滾動瀏覽鎖定函數列表。

我有四個設計類型: 1)命名空間方法隱藏基於 2)類方法隱藏 3)PIMPL版本 4)_前綴

這裏是爲了清楚的代碼:

#pragma once 
#include <memory> 

using namespace std; // ignore the fact this is global here 

struct Hide_Test_Data 
{ 
    int value; 
}; 

namespace Hide_Test_Private_Member_Ns 
{ 
    void private_function(Hide_Test_Data& data) {} 
}; 

class Hide_Test_Methods 
{ 
public: 
    Hide_Test_Methods() {} 
    void private_function(Hide_Test_Data& data) {} 
}; 

class Hide_Test_Methods_Alt 
{ 
public: 
    Hide_Test_Methods_Alt() {} 
    void private_function() {} 
private: 
    Hide_Test_Data htd_; 
}; 

class Hide_Test 
{ 
public: 
    Hide_Test() {} 

    void public_function() 
    { 
     _private_function(); // member function prefixed with _ 
     Hide_Test_Private_Member_Ns::private_function(htd_); // namespace version 
     htm_.private_function(htd_); // subclass version (no private data) 
     pimpl->private_function(); // pimpl version (with private data) 
    } 

private: 
    Hide_Test_Data htd_; // class to hold data 
    Hide_Test_Methods htm_; // class to hold methods 
    void _private_function() {}; // _ prefixed member function 
    unique_ptr<Hide_Test_Methods_Alt> pimpl; 
}; 

注:

  • 的的unique_ptr Hide_Test_Methods_Alt版本具有m燼數據,這是標準的數據。兩者都可以以任何方式實施。

  • _前綴不隱藏成員數據,但它確實將其移動到列表的末尾。這具有允許用戶在感興趣的情況下看到私人功能的優點。我的主要目標不是隱藏私有成員函數,而是將它們移開。

  • 只要符合小寫字母,使用_'前綴'數據應符合標準的全局範圍。

哪種設計在一般情況下更易於接受?我想我可以舒適地使用這四種設計類型,但我寧願聽到一些關於我可能沒有想到的優點和缺點的意見。

Pimpl使用指針輕鬆複製成員數據。在我不需要複製成員數據的情況下,只是使用一個更好或更差的類?

我已經做了一些研究,發現在這個論壇上一些相關的主題:

Hiding private data members? (C++) - 這其中指出PIMPL方法(這是我加入到我的例子以上)。

How to hide private members of a Class? - 約VS智能感知沒有隱瞞私有成員

Why does Visual Studio's intellisense show private members and functions?會談 - 讓#ifdef來解決,我真的不喜歡的想法。

我覺得這個問題不同於其他人提出的值得發佈。一如既往地感謝。

+0

嘗試VS2013?它隱藏了來自intellisense的私人成員。 – Jon

+0

我聽說過。但是,不,還沒有。不想使用Windows 7. – David

+0

我開始認爲由於缺乏反應,這肯定是一個糟糕的問題。 – David

回答

2

通常,當您希望能夠在鏈接時更改實現時應用pimpl模式,並且因此必須是指針 在這裏,您不需要開銷,因此您可以考慮內部類和實例而不是一個指針類:

class fewfunctions 
{ 
    class manyfunctions 
    { 
    public: 
     int a1() { return 0; } 
     int a2() { return 0; } 
     int a3() { return 0; } 
     int a4() { return 0; } 
     // ... many more 
    }; 
public: 
    int b() { return a.a1() + a.a2() + a.a3() +a.a4(); } 
private: 
    manyfunctions a; 
}; 

僅有b將顯示爲一個功能(顯示爲鎖定)

+0

感謝您的迴應!現在我在單獨的命名空間中使用實現類。我想知道我是否還有其他的優缺點。 – David

+0

只要你沒有使用指針,性能不會改變 子類的主要優點是任何人維護代碼只需要在一個地方看 然後,有些人不喜歡子類 btw ,爲什麼一個單獨的命名空間? –

+0

在我的解決方案?我添加了名稱空間來隱藏全局函數。 – David