[過去ログ] C++相談室 part164 (1002レス)
前次1-
抽出解除 レス栞

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
481
(2): デフォルトの名無しさん (JP 0H8a-PPvg) [] 2023/07/15(土) 21:13:09.66 ID:2P0YU21lH(1/2) AAS
あるクラスにあるクラスのコレクションを抱かさせてるなんて良くあると思うけど
その際に外部からそのコレクションを参照したい場合、どうするのが定石なの?
class Datas
{private:std::vector<Data> _datas;};

publicにするとか、std::vector<Data>::iteratorをpublicにするとか
const Data& operator[](int index)をpublicにするとかいろいろあると思うけど
487: はちみつ餃子◆8X2XSCHEME (ワッチョイ 163e-MI76) [sage] 2023/07/15(土) 21:58:55.40 ID:oCSaktaG0(2/3) AAS
>>481
場合による。

見せる相手が最初から限定的であるような場合はフレンドを宣言すればいい。
コンテナ系クラスとかは内部的にはたぶんノードを表すクラスとか
も使ってると思うけどそういう感じで密接に関連がありつつ
他では使う可能性がないような強い関係性がある場合はフレンドにする。

データを保持するためだけの汎用クラスとして定義するならデータメンバは public にしてもかまわない。
std::pair とかはそうなってる。

もうちょっと疎結合にしたいときなら許したい操作だけをpublic なメンバ関数として公開すると思う。

既存のクラスを使いつつ外部に公開するのはサブセットにしたいという場合なら
プライベート継承した上で公開したいメンバだけ using するという方法も取れる。

#include <iostream>
#include <vector>

struct Data : private std::vector<int> {
using std::vector<int>::vector;
using std::vector<int>::operator[];
using std::vector<int>::begin;
using std::vector<int>::end;
};

int main(void) {
Data foo = {1, 2, 3};
for (int x : foo) {
std::cout << x << std::endl;
}
}
488: デフォルトの名無しさん (ワッチョイ df01-L4gQ) [sage] 2023/07/15(土) 22:04:51.15 ID:wfhnDtnz0(3/3) AAS
>>481
privateメンバなのだから
できるだけ外部からそのコレクションを参照しないように設計するべきだと思うよ
どうしてもってならiteratorではなくconst_iteratorにするとか
あなたが書いてるようにconst Data&を返すaccessorを実装するとか
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.040s