有効な C++ の項目 28 は言うavoid returning "handles" to object internals
。この質問は、クラスの内部を誤って公開することを避けるために、カプセル化について考えることによって、コードを正確に設計する方法を示しています。
私の例にはデータ配列が含まれており、メモリは使用を避けたい問題であるためstd::vector
(および Boost ライブラリ)。
ここで配列を使用すると、私のコードの非常に単純化されたバージョンになります。
class Foo {
public:
Foo(int size) : data_(new int[size]) {
// Populate with data just for the example
for(int i = 0; i < size; i++) {
data_[i] = i;
}
}
// I know that this isn't good practice
int* const get_data() const {
return data_;
}
~Foo() {
delete[] data_;
}
private:
int* data_;
};
int main(void) {
Foo* foo = new Foo(10);
int* const data = foo->get_data();
delete foo;
// data now dangles which is bad!
return 0;
}
const
with を使用しget_data()
ても安全ではないことを理解しています。ベクトルを使用している場合は、上記の質問の例のようにコピーできますが、これを避けたいので、この潜在的に危険な状況を回避するためにクラスを設計する最善の方法を考えていましたか?