指向 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 中持有两个指针(并且很少,如果有的话,持有一个指针)。
我试图在一个获取方法中获取多个指针,而不让用户有权修改数据。这是我的实现:
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 中持有两个指针(并且很少,如果有的话,持有一个指针)。