我试图在一个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 *,但我想知道是否有正确的方法来做到这一点。
答案 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指针。