从'const type *'到'type *'的无效转换

时间:2015-10-21 13:52:25

标签: c++ pointers reference const

我想通过类的构造函数存储指向另一个类的对象的指针。这样做的正确方法是什么?

如果我将MyClass1* ptr替换为const MyClass1* ptr,则没有错误,但在这种情况下,我认为我无法再更改ptr。实现我想要的正确方法是什么?

example.cpp

class MyClass1{
    public:
        int a;
        int b;
};

class MyClass2{
    MyClass1* ptr;
    public:
        MyClass2(const MyClass1& obj){ptr = &obj;};
};

int main(int argc, char* argv[]){
    MyClass1 object1;
    object1.a = object1.b = 0;
    MyClass2 object2(object1);

    return 0;
}

通过g++ -o example example.cpp编译它给我这个错误

  

example.cpp:在构造函数'MyClass2 :: MyClass2(const MyClass1&)'中:

     

example.cpp:10:3​​7:错误:从'const MyClass1 *'无效转换为'MyClass1 *'[-fpermissive]

     

MyClass2(const MyClass1& obj){ptr =& obj;};

4 个答案:

答案 0 :(得分:3)

如果你想改变ptr指向的东西,那么你的函数需要通过非const引用来获取它的参数(因为MyClass2可能会修改它):

MyClass2(MyClass1& obj) { ptr = &obj; }

或者,如果您不打算修改ptr指向的内容,则应将ptr声明为指向const的指针:

const MyClass1* ptr;

这两种解决方案都会导致代码编译。

答案 1 :(得分:3)

基于最后几条评论回答。

我将给你一个应用于带有int的指针的const的例子,

int a = 2;
int b = 3;

int*              p1 = &a; // Modifiable pointer  modifiable value
const int*        p2 = &a; // Modifiable pointer  const value
int* const        p3 = &a; // Const pointer       modifiable value
const int * const p4 = &a; // Const pointer       const value

*p1 = 3; // Ok, modifiable left-value
*p2 = 4; // Error: non-modifiable left-value
*p3 = 5; // Ok
*p4 = 6; // Error

p1 = &b; // Ok: modifiable pointer
p2 = &b; // Ok
p3 = &b; // Error
p4 = &b; // Error

在你的情况下,你正在寻找一个可修改的指针但是一个const值。所以你想要第二种情况,

const MyClass1* ptr;

(这是你原来的)

看起来你真的没有尝试改变指针吗?

答案 2 :(得分:2)

我从评论中知道您要修改指针的内容,而不是对象指针指向的内容,因此请将ptr指针声明为const MyClass1* ptr。这意味着ptr是一个引用const MyClass1的指针。因此,您可以更改指针,但无法修改指针引用的对象。

答案 3 :(得分:0)

首先删除额外的;

MyClass2(const MyClass1& obj){ptr = &obj;}

无法在函数内部传递const参数(稍后可能会对其进行修改),因此这可能有效:

MyClass2(MyClass1 & obj){
    ptr = &obj;
}

但是这里& obj的值会转义本地范围。