Effective 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
withget_data()
并不安全。如果我使用的是向量,我可以像上面的示例问题一样复制它,但是由于我想避免这种情况,我想知道如何最好地设计我的类来避免这种潜在的危险情况?