1

VS では、「クラス」と入力すると。呼び出すことができる関数のリストが表示されます。15 ~ 20 個の関数のリストに目を通す必要があり、その半分以上がメンバーであるというのは良くありません。

ユーザーがロックされた関数のリストをスクロールする必要がないように、プライベートメンバー関数を非表示にするか、リストの最後に移動するシステムを見つけることに非常に興味があります。

4 つのデザイン タイプがあります。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 バージョンには、標準のものにはないメンバー データがあります。どちらもどちらの方法でも実装できます。

  • _ プレフィックスはメンバー データを隠しませんが、リストの最後に移動します。これには、ユーザーが興味を持っている場合にプライベート関数を表示できるという利点があります。私の主な目標は、プライベート メンバー関数を非表示にすることではなく、邪魔にならないようにすることです。

  • データの前に _ を付けることは、その後に小文字が続く限り、標準に従ってグローバル スコープ外で安全である必要があります。

これらのデザインのうち、一般的により受け入れられるのはどれですか? これら 4 つのデザイン タイプすべてを快適に使用できると思いますが、思いもよらなかった長所と短所のいくつかについて意見を聞きたいと思います。

Pimpl はポインターを使用して、メンバー データのコピーを容易にします。メンバー データをコピーする必要がない場合、単にクラスを使用する方が良いですか、悪いですか?

私はいくつかの調査を行い、このフォーラムでいくつかの関連するスレッドを見つけました。

プライベート データ メンバーを非表示にしますか? (C++) - これは pimpl イディオムを指摘しています (上記の例に追加しました)。

クラスのプライベートメンバーを非表示にする方法は? -プライベートメンバーを非表示にしないVSインテリセンスについて話します

Visual Studio のインテリセンスがプライベート メンバーと関数を表示するのはなぜですか? -私があまり好きではない#ifdefソリューションを提供します。

この質問は、投稿する価値があると提示された他の質問とは十分に異なっていると思います。いつもありがとう。

4

1 に答える 1

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 のみが関数として表示されます (a はロックされていると表示されます)。

于 2013-11-07T16:18:38.760 に答える