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

gvg*_*zio 8 c++ pointers const reference

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

如果我取代MyClass1* ptrconst 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;
}
Run Code Online (Sandbox Code Playgroud)

通过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;};

asl*_*slg 6

根据最后几条评论回答。

我将给您一个将 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
Run Code Online (Sandbox Code Playgroud)

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

const MyClass1* ptr;
Run Code Online (Sandbox Code Playgroud)

(这是你原来拥有的)

看来您实际上并没有尝试更改指针?


eml*_*lai 5

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

MyClass2(MyClass1& obj) { ptr = &obj; }
Run Code Online (Sandbox Code Playgroud)

或者,如果你不打算修改ptr指向的东西,那么ptr应该声明为一个指向-的指针const

const MyClass1* ptr;
Run Code Online (Sandbox Code Playgroud)

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