0

というコンテナ クラスがあるとしmyListます。capacityこのコンテナー クラスには、インスタンス内の値の数を保持するという名前のプライベート メンバー変数があります。

クラスのユーザーがcapacityfor にアクセスできると便利な場合があります。たとえば、ループ内の各値を調べているときに最後に到達したことを知ることができます。したがって、capacity公開する必要があります。

ただし、これにより、クラスのユーザーが を変更できるようになりcapacity、明らかに問題が発生します。

myList myInstance;
myInstance.capacity = 123;

capacityプライベート変数であるの値を返すだけのパブリック メンバー関数を使用することは、悪い習慣と見なされますか? 例えば:

unsigned int getCapacity()
{
    return capacity;
}

の値が変更さcapacityれるたびに の値に更新される「クローン」変数についてはどうでしょうか。capacityクラスのユーザーは、プライベート変数自体ではなく、パブリックの「クローン」にアクセスします。

4

7 に答える 7

4

容量ゲッターを持っています。
ただし、それを const メンバーとしてマークします。

unsigned int getCapacity()  const
{                        //^^^^^^^ 
    return capacity;
}

2 番目の解決策は機能しません。
信頼性がないため (1 人のユーザーが更新すると、次のユーザーが読み取ったときに無効な値を取得する可能性があります)。

ただし、クラスのユーザーが本当にこの情報を必要としているかどうかを検討する必要があります。
彼らはそれで何ができますか?

容量が足りない場合は、メモリを事前に割り当てますか?

MyList   x;
// I am going to add 10 items make sure there is enough room.
if (x.size() + 10 < x.capacity())
{    x.resize(x.size() + 10);
}

この状況では、常にサイズを変更してください。次に、スペースがすでにある場合は、コンテナーを何も行わないようにします。

x.resize(x.size() + 10);  // If the container has enough space do nothing. 
                          // Otherwise make sure there is enough room for 10 more items.

通常、オブジェクトは、内部状態へのアクセスを提供して他のオブジェクトが間接的に管理できるようにするよりも、それ自体を管理する方が適切です。実装を実際の変数から分離していても、容量を持つインターフェイスに自分自身を結合しているため、実際には意味のある利点が得られません。

そのため、メソッドは (一般に) オブジェクトに対してアクションを実行するアクション (動詞) である必要があります。これらのアクションは、オブジェクトの状態を操作します。アクションをオブジェクトへのインターフェースにします。オブジェクトへのインターフェイスを定義すると、そのインターフェイスを変更する (機能を削除する) のは非常に難しいことに注意してください。

于 2011-01-07T15:22:32.113 に答える
2

アクセサーは優れたソリューションです。これは、STL によって選択されたものです。std::vector::capacity()、std::vector::size() などを参照してください。

于 2011-01-07T15:17:01.813 に答える
2

あなたが説明する最初のソリューションはゲッターとして知られており、これらを使用することをお勧めします。

2 番目の解決策は、実際には解決策ではありません。単に 2 番目の変数を追加し、それを更新する必要性を導入するだけです。

于 2011-01-07T15:17:40.653 に答える
1

いいえ、それは悪い習慣ではありません。実際、ゲッターとセッターの使用はベスト プラクティスと見なされます。

于 2011-01-07T15:16:51.707 に答える
1

まったく悪い習慣ではありません。これが実際にこれを行う必要がある方法です。

于 2011-01-07T15:17:23.227 に答える
0

private非constポインターを介してアドレスではなく、値またはconstポインターでメンバーを返す限り、問題はありません。

于 2011-01-07T15:18:39.600 に答える
0

パブリック ゲッターがある場合は、容量のコピーまたは const 参照を返すだけです。

これにより、クライアントはデータを表示できますが、変更することはできません。

于 2011-01-07T15:17:42.013 に答える