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

时间:2015-01-05 15:58:18

标签: c++ output const getter

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

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一样实现返回const int *,但我想知道是否有正确的方法来做到这一点。

2 个答案:

答案 0 :(得分:2)

在c ++中,返回多个值的正确方法是参考:

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

(我还使内联方法简化了示例)

如果您想禁止更改数据,请返回指向const

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

请注意,用户仍可以delete的结果致电free(但不是getAB);有关详情,请参阅this question。如果您想禁用delete,可以通过智能指针替换指针(例如std::unique_ptr)。

实际上,如果你希望你的代码与c ++异常兼容,你就不应该在你的类中保留两个指针(如果有的话,很少有一个指针)。

答案 1 :(得分:1)

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

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指针。