微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

C++:将指向常量对象的指针复制到非常量对象指针中

如何解决C++:将指向常量对象的指针复制到非常量对象指针中

在我的自定义类中,我在将输入变量指针声明为常量并将其复制到非常量成员变量指针时出错。

我得到的错误是:

无法使用类型为“Position *”的成员子对象初始化 'const Position *' 类型的左值

为什么会这样?为什么这与其他成员变量(_attack)不一致?它只是以与复制 int (_attack) 的值相同的方式复制指针(地址)的值。

class Creature
{
private:
  int _attack;
  Position* _position;
public:
  Creature(const int attack,const Position* position)
      : _attack{attack},_position{position} // ERROR: Cannot initialize a member subobject of type 'Position *' with an lvalue of type 'const Position *'
  {}
};

解决方法

第一个参数不引用构造函数范围之外的任何内容,因为它只是一个副本。在这种情况下,const 只是表示您的构造函数本身不允许更改 attack 的值。

第二个参数是一个指向 const Position 的指针。如果您可以将其分配给非常量 Position*,则您可以通过非常量指针改变该位置。如果允许这样做,那么如果某人有一个他们不想被您的构造函数改变的位置指针,那么他们将无法创建您的类的实例。

请注意,您可以通过将第二个参数更改为 Position* const position 来使其行为与第一个相同。这使得指针成为常量,而不是它指向的对象。

请参阅 this 相关问题。

,

指针有 const 的两种“类型”。他们是

const T * pointer_name

T * const pointer_name

也可以组合到

的第三种也是最后一种形式
const T * const pointer_name

对于第一个,您创建了一个指向 const T 的指针。这就是你在构造函数中所拥有的。这违背了 _position 的类型,它是 T *,或者更确切地说,是一个指向非常量 T 的指针。这就是您收到错误的原因。您不能将指向非常量 T 的指针的值分配给指向非常量 const T 的指针。

使用第二种形式,您的代码可以编译,因为现在您没有指向 const T 的指针,而是拥有指向 constT 指针。两个指针都指向一个非常量的东西,所以可以将一个分配给另一个

这与 attack 发生的情况相同。虽然它可能是 const,但您仍然可以复制它的值并将其放入另一个对象中。

最后一个形式是一个指向 constconst T 指针,由于第一个 from 不起作用的原因,这里不再起作用。


这也有点进入东海岸与西海岸的常量风格。上面的西海岸风格,有时候不是那么容易理解类型的。相反,您可以使用东海岸风格,如

T const * pointer_name
T * const pointer_name
T const * const pointer_name

现在他们都从右到左准确地读取类型是什么。

,

对于构造函数的 attack 参数(声明为 const),您正在复制给您的成员变量(_attack ),这是不是 const;但是,对该成员变量的后续修改不会改变传递参数的值,因此您不会“违背您的承诺”。

然而,在 position 参数的情况下,情况非常不同:这里的 const 限定符声明它指向一个不能修改的对象;但是,如果您将该指针的值(即地址)复制到非常量成员变量,那么您将允许修改引用的对象。因此,编译器(正确地)告诉您不能这样做。

如果你实际上想要的是传递一个指针,它是一个不可变的地址,但是给一个可以改变的对象,那么您需要移动构造函数参数中的 const 关键字:

    Creature(const int attack,Position* const position) // POINTER is const,POINTEE is not!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。