是否有可能在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 ,但还不够..不起作用..有什么想法吗?
答案 0 :(得分:2)
使用带有非const方法的const成员是禁止的(除非使用mutable
)。在声明const
和foo()
:
update()
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();
^^^^^^^^^^^^^^
}
答案 1 :(得分:2)
这里有两个选择。要么使A ::更新为const函数 -
Class A {
void update() const;
}
或删除指针的常量。
Class B{
public:
void foo() {
const_cast<A*>(a_)->update();
}
private:
const A* const a_;
}
前者是首选方法,但这也会阻止你在A级更新中做任何有用的事情。
根据经验,如果你必须将const转换为某些东西,那么你真的想先看看为什么指针是const。
答案 2 :(得分:0)
假设您无法将方法声明为const
并且您知道自己在做什么(tm)以及为什么这样做不好:请尝试const_cast
!
答案 3 :(得分:0)
*之后的const与它无关。您必须声明使用a_作为const函数的函数。如果它们没有编译,你必须使用const_cast或reinterpret_cast在调用之前从指针中删除const。但是这非常狡猾,如果update()函数修改了最初声明为const的对象,则这是未定义的行为。 / p>
答案 4 :(得分:0)
您有几个选择:
使用const_cast
抛弃const并调用方法。
使update
成为const方法,以便可以通过const指针调用它。
首先不要将a_
存储为const。将其更改为A* const a_
,以便您可以调用非const方法,但无法更改指针。
答案 5 :(得分:0)
你得到的错误
将'const A'作为'void A :: update()'的'this'参数传递丢弃 限定符[-fpermissive]
是在non-const
指针上调用const
方法的结果。这是被禁止的。由于您需要将更新设为non-const
并且无法存储指向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_;
};
然而,您应该重新考虑您的设计。
答案 6 :(得分:0)
如前所述,使用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_;
};