将const T * const转换为T *

时间:2014-03-28 11:59:23

标签: c++ pointers casting

是否有可能在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 ,但还不够..不起作用..有什么想法吗?

7 个答案:

答案 0 :(得分:2)

使用带有非const方法的const成员是禁止的(除非使用mutable)。在声明constfoo()

后声明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_;
};