I want to store through the constructor of a class a pointer to an object of another class. What is the correct way to do that?
If I substitute MyClass1* ptr with const MyClass1* ptr there is no error, but in this case I think that i cannot change ptr anymore. What is the correct way to achieve what i want?
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;
}
Compile it through g++ -o example example.cpp give me this error
example.cpp: In constructor ‘MyClass2::MyClass2(const MyClass1&)’:
example.cpp:10:37: error: invalid conversion from ‘const MyClass1*’ to ‘MyClass1*’ [-fpermissive]
MyClass2(const MyClass1& obj){ptr = &obj;};
If you want to change the thing that ptr points to, then your function needs to take its argument by non-const reference (since MyClass2 might modify it):
MyClass2(MyClass1& obj) { ptr = &obj; }
Or, if you don't intend to modify the thing that ptr points to, then ptr should be declared as a pointer-to-const:
const MyClass1* ptr;
Both of these solutions will cause the code to compile.
Answering based on the last few comments.
I'll give you an example of const applied to pointers with ints,
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
In your case, you're looking for a modifiable pointer but a const value. So you want the second case,
const MyClass1* ptr;
(Which is what you originally had)
It would seem you didn't actually try to change the pointer?
I known from the comment that you want to modify the content of pointer, not the object pointer points to, so please declare the ptr pointer as const MyClass1* ptr. This means that ptr is a pointer which refers to a const MyClass1. So you can change the pointer, but you are not able to modify the object referenced by the pointer.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With