我有一个带有指针的结构。我想这样做,如果一个struct实例是const,那么它的指针内容就不能被修改。
(n*(i-1)+j)
有没有办法将constness从struct传递给它的指针和引用成员?
答案 0 :(得分:6)
封装救援!
只需通过界面进行访问:
struct Bar {
Foo * getFoo() { return foo; }
Foo const * getFoo() const { return foo; }
private:
Foo *foo;
};
void f(Bar& bar) {
*bar.getfoo() = Foo(); // OK
}
void g(const Bar& bar) {
*bar.getfoo() = Foo(); // Error!
}
答案 1 :(得分:2)
你正在与语言作斗争,不要这样做。它就像在上游游泳一样 - 你只会厌倦自己而不喜欢结果。
您可以使用私人数据和成员函数来解决您的问题:
struct Foo {};
struct Bar {
void reset() {
*foo = Foo();
}
private:
Foo *foo;
};
void f(Bar& bar) {
bar.reset(); // OK
}
void g(const Bar& bar) {
bar.reset(); // fails, as reset is not declared const
}
答案 2 :(得分:1)
使const支持智能指针:
template<typename T>
struct const_ptr : std::unique_ptr<T> {
using std::unique_ptr<T>::unique_ptr;
const T& operator*() const {
return std::unique_ptr<T>::operator*();
}
const T* operator->() const {
return std::unique_ptr<T>::operator->();
}
T& operator*() {
return std::unique_ptr<T>::operator*();
}
T* operator->() {
return std::unique_ptr<T>::operator->();
}
};
然后,试图通过const const_ptr
改变对象引用将导致错误:
const_ptr<int> iptr = std::make_unique<int>(6);
*iptr = 7; // okay
const auto ciptr = std::move(iptr);
*ciptr = 2; // error
但是,请注意,由于我们公开std::unique_ptr
,他的功能仍然可用。您可能希望使用私有继承并使用除自定义之外的所有其他函数:
template<typename T>
struct const_ptr : private std::unique_ptr<T> {
using std::unique_ptr<T>::unique_ptr;
// Implement our operators like above
using std::unique_ptr<T>::release;
using std::unique_ptr<T>::reset;
// .. all other public functions
};