指向 const 作为输出参数的指针 c++

Pointer to const as output parameter c++

我试图在一个获取方法中获取多个指针,而不让用户有权修改数据。这是我的实现:

class A {
public:
   bool getAB( int** a, int** b ) const
protected :
   int * a_;
   int * b_;
}


bool getAB( int** a, int** b ) const
{
    *a = a_;
    *b = b_;
     return true;
}

但是通过这种方式,用户可以修改,甚至释放数据。 我可以实现两个不同的 getter return const int*,但我想知道是否有正确的方法来做到这一点。

你确实可以保护更多的内部值,但很难禁止删除。这是我能做的最好的

class A {
public:
   bool getAB( const int ** const  a, const int ** const  b ) const;
   A(int * a, int *b): a_(a), b_(b) {}
protected :
   int * a_;
   int * b_;
};


bool A::getAB( const int ** const  a, const int ** const  b ) const
{
    *a = a_;
    *b = b_;
     return true;
}

int main() {
    int i=1;
    int j=2;

    A a(&i, &j);

    const int *  p1;
    const int *  p2;
    // int *  p2; error

    a.getAB(&p1, &p2);

    // *p1 = 3;  error
    // delete p1; unfortunately gives no errors

    cout << *p1 << " " << *p2 << endl;
    return 0;
}

它确实需要指向 const 的指针,但不幸的是允许删除。并且不能传递const指针,因为const指针必须立即初始化。

在 c++ 中,return 多个值的正确方法是通过引用:

class A {
public:
   bool getAB( int*& a, int*& b ) const
   {
      a = _a;
      b = _b;
   }
protected :
   int * a_;
   int * b_;
}

(为了简化示例,我还内联了该方法)

如果您想禁止更改数据,return 指向 const 的指针:

class A {
public:
   bool getAB( const int*& a, const int*& b ) const
   {
      a = _a;
      b = _b;
   }
protected :
   int * a_;
   int * b_;
}

请注意,用户仍然可以对 getAB 的结果调用 delete(但不能调用 free);有关详细信息,请参阅 this question。如果你想禁止delete,你可以用智能指针替换指针(例如std::unique_ptr)。

实际上,如果您希望您的代码与 C++ 异常兼容,您永远不应该在 class 中持有两个指针(并且很少,如果有的话,持有一个指针)。