[英]Convert const T* const to T*
在C ++中进行这种转换是可能的吗?
我需要以这种方式声明我的属性。
Class A {
public:
void update() { ++i_; }
private:
int i_;
}
Class B{
public:
void foo() {
a_->update(); /* Error */
}
private:
const A* const a_;
}
错误是:
将'const A'传递为'void A :: update()'的'this'参数时,将丢弃限定符[-fpermissive]
我尝试使用static_cast ,但还不够..不起作用..有什么想法吗?
禁止将const成员与非const方法一起使用(除非使用mutable
)。 在foo()
和update()
声明后放置一个const
:
void update() const { ... }
^^^^^
void foo() const { ... }
^^^^^
要么 ...
如果您不想使update
为const
,则可以使用const_cast
:
void foo() const // Now, this const keyword is optional but recommanded
{
const_cast<A*>(a_)->update();
^^^^^^^^^^^^^^
}
您在这里有两个选择。 要么使A :: update一个const函数-
Class A {
void update() const;
}
或删除指针的常数。
Class B{
public:
void foo() {
const_cast<A*>(a_)->update();
}
private:
const A* const a_;
}
前者是首选方法,但是这也会使您无法进行A类更新中的任何有用操作。
根据经验,如果必须将const抛弃掉,那么您真的很想看看为什么指针是const的。
假设您不能将方法声明为const
,并且知道自己在做什么(tm)以及这样做的原因:尝试const_cast
!
*之后的const与它无关。 您必须声明将a_用作const函数的函数。 如果它们未编译,则必须在调用之前使用const_cast或reinterpret_cast从指针中删除const。但这非常狡猾,如果update()函数修改了最初声明为const的对象,则这是未定义的行为。
您有几种选择:
使用const_cast
放弃const并调用该方法。
make update
const方法,以便可以通过const指针调用它。
首先不要将a_
作为const存储。 将其更改为A* const a_
以便您可以调用非const方法,但是指针不能更改。
你得到的错误
将'const A'传递为'void A :: update()'的'this'参数时,将丢弃限定符[-fpermissive]
是在const
指针上调用non-const
方法的结果。 这是禁止的。 由于您需要更新non-const
且无法存储指向non_const A
的指针, non_const A
可以使用运算符const_cast
抛弃const
,这是这样做的方法:
class A {
public:
void update(){}
};
class B{
public:
void foo() {
const_cast< A*>(a_)->update(); /* OK*/
}
private:
const A* const a_;
};
但是,您应该重新考虑您的设计。
正如之前有人提到的,使用mutable / const,但这会稍微改变您的设计:
class A {
public:
void update() const { ++i_; } // this will make the method callable by const A*
private:
mutable int i_; // and this will make you field mutable in a const method
};
class B{
public:
void foo() {
a_->update();
}
private:
const A* const a_;
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.