将constness从结构传递给它的指针和引用成员

时间:2017-09-09 03:48:32

标签: c++ const

我有一个带有指针的结构。我想这样做,如果一个struct实例是const,那么它的指针内容就不能被修改。

(n*(i-1)+j)

有没有办法将constness从struct传递给它的指针和引用成员?

3 个答案:

答案 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
};