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;