我想通过类的构造函数存储指向另一个类的对象的指针。这样做的正确方法是什么?
如果我将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:37:错误:从'const MyClass1 *'无效转换为'MyClass1 *'[-fpermissive]
MyClass2(const MyClass1& obj){ptr =& obj;};
答案 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的值会转义本地范围。