繁体   English   中英

将const T * const转换为T *

[英]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 { ... }
           ^^^^^

要么 ...

如果您不想使updateconst ,则可以使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM