C++ 从‘;常数类型*’;至‘;类型*’;

C++ 从‘;常数类型*’;至‘;类型*’;,c++,pointers,reference,constants,C++,Pointers,Reference,Constants,我想通过类的构造函数存储指向另一个类的对象的指针。正确的方法是什么 如果我用const MyClass1*ptr替换MyClass1*ptr,没有错误,但在这种情况下,我认为我不能再更改ptr。实现我想要的东西的正确方法是什么 example.cpp class MyClass1{ public: int a; int b; }; class MyClass2{ MyClass1* ptr; public: MyClass

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

如果我用
const MyClass1*ptr
替换
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示例编译它。cpp
告诉我这个错误

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

示例.cpp:10:37:错误:从“常量MyClass1*”到“MyClass1*”的转换无效[-fpPermissive]

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


如果要更改
ptr
指向的对象,则函数需要通过非
const
引用获取其参数(因为
MyClass2
可能会修改它):

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

const MyClass1* ptr;

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

首先删除多余的代码

MyClass2(const MyClass1& obj){ptr = &obj;}
无法在函数内传递常量参数(以后可能会对其进行修改),因此这可能会起作用:

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

但在这里,&obj的值不属于本地范围。

根据最后几条注释进行回答

我给你举一个const应用于int指针的例子

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 MyClass1* ptr;
(这是你最初拥有的)


看起来您实际上没有试图更改指针?

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

可能重复的,为什么不删除
obj
参数的
const
修饰符?您也可以直接传递指针而不是引用。@aslg:因为我不希望构造函数可以修改对象。(我知道没有任何东西可以实际修改该对象)@giusva但是如果你想在你的实例中存储一个可修改的指针,你不能给它一个常量指针。你不能两全其美。构造函数最终是属于类的函数。它可以对成员数据以及任何其他成员函数进行操作,即使您不希望在特定情况下使用它。@giusva您是对的,如果只看您所要求的内容,它实际上不是重复的。但是这个问题与您的基本问题/根本问题相匹配:“const MyClass1*”中的const是什么?
const MyClass1&
是不安全的,因为可以传递一个临时的inIt,而inIt也是不安全的,因为可能传递一个生命周期比
Class2
对象短的非临时对象。一般来说,由于这些生存期问题,长期存储非拥有的引用/指针会带来麻烦。@zenith:在我的算法中,
Class1
的对象的生存期比
Class2
的对象的生存期长,后者的指针指向第一个对象。然而,总的来说,这显然不是事实。我怎么能考虑到这件事?@giusva你不能。但是你可以使用<代码> SyddypTr>代码来共享所有权并保持一个对象存活。在C++中,编译器中没有机制可以检查你是否正确地管理你引用的对象的寿命(例如在锈蚀中)。在这方面你只能靠自己。尽管您始终可以选择通过使用CoffeeandCode中提到的
shared_ptr
将引用对象的所有权共享给
ptr
来绕过它,只要有
shared_ptr
指向它,引用对象就会保持活动状态。
const MyClass1* ptr;