gvg*_*zio 8 c++ pointers const reference
我想通过类的构造函数存储指向另一个类的对象的指针.这样做的正确方法是什么?
如果我取代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;
}
Run Code Online (Sandbox Code Playgroud)
通过g++ -o example example.cpp给我这个错误编译它
example.cpp:在构造函数'MyClass2 :: MyClass2(const MyClass1&)'中:
example.cpp:10:37:错误:从'const MyClass1*'无效转换为'MyClass1*'[-fpermissive]
MyClass2(const MyClass1&obj){ptr =&obj;};
根据最后几条评论回答。
我将给您一个将 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)
(这是你原来拥有的)
看来您实际上并没有尝试更改指针?
如果你想改变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)
这两种解决方案都会导致代码编译。