const指针的这种方法是否还可以?

时间:2014-12-03 12:38:49

标签: c++

我想提供不同级别的const访问权限'我的数据。例如,取决于是否应修改指针或数据。所以这就是我提出的:

class MyClass
{
    int n;
    int* ptr_to_data;
    int* const const_ptr_to_data;
    const int * ptr_to_const_data;
public:
    MyClass(int nn) 
        : n(nn),
          ptr_to_data(&n),
          const_ptr_to_data(ptr_to_data),
          ptr_to_const_data(ptr_to_data)
    {
    }
    ~MyClass() { }

    int& get_data()
    {
        return *const_ptr_to_data;
    }

    const int& get_data() const
    {
        return *ptr_to_const_data;
    }
};

这里的目标是通过限制尽可能多的访问来避免程序员错误。这是一个很好的方法,如何让它变得更好?

2 个答案:

答案 0 :(得分:6)

你有两个get_data函数的正确方法,但所有的指针只会让代码更难维护。这就足够了:

int& get_data() { return n; }
const int& get_data() const { return n; }

答案 1 :(得分:2)

您存储的指针对访问问题没有帮助,正如您将看到的那样,但是当您复制对象时,它们将引用错误实例中的数据,除非您负责复制。顶级const可防止为类实例分配。即指针是有问题的,并没有任何好处。

而是这样做:

int data() const
{
    return n_;
}

void set_data( int const value )
{
    n_ = value;
}

或者您可以像在标准库中那样使用data来设置setter,但命令式表单在调用代码中更具可读性。


此方法的一个关键功能是不会传递指向非const 数据成员的指针或引用。

因为通过传递不受限制的引用或指针,您将失去对该数据成员更改的所有控制权,特别是在维护类不变量,可能是其他相关值,强加范围限制,检查何时进行更改等等方面