2015-10-21 3 views
5

Я хочу сохранить через конструктор класса указатель на объект другого класса. Каков правильный способ сделать это?Неверное преобразование из 'const type *' to 'type *'

Если я могу заменить 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: 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;};

+3

Возможный дубликат [В чем разница между const int \ *, const int \ * const и int const \ *?] (Http://stackoverflow.com/questions/1143262/what-is-the-difference -between-const-int-const-int-const-and-int-const) –

+0

Почему бы вам не удалить модификатор 'const' вашего аргумента' obj'? Также вы можете напрямую передать указатель вместо ссылки. – aslg

+0

@aslg: потому что я не хочу, чтобы конструктор мог изменять объект. (я знаю, что нет ничего, что реально меняет этот объект) – giusva

ответ

2

Если вы хотите изменить вещь, которая ptr указывает, то ваша функция должна принять его аргумент, не const ссылка (с MyClass2 может изменить):

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

Или, если вы не собираетесь изменять вещь, которая указывает на ptr, то ptr должен быть объявлен как указатель-to const:

const MyClass1* ptr; 

Оба эти решения будут вызывать код для компиляции ,

+0

'const MyClass1 &' небезопасно, потому что временное может быть передано в – CoffeeandCode

+1

. Оно также небезопасно, потому что может быть передан не временный объект со временем жизни, короче, чем объект класса 2. В целом, хранение не принадлежащих ссылок/указатели долгое время просят о проблемах из-за этих жизненных проблем. – emlai

+0

@zenith: в моем алгоритме объект класса Class1 имеет продолжительность жизни дольше, чем объект класса Class2, который имеет указатель на первый. Однако это, очевидно, не так. Как я могу принять во внимание это событие? – giusva

0

Сначала удалите лишний;

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

не может пройти константный аргумент внутри функции (может изменить его позже), так что это может работать:

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

но здесь значение & OBJ ускользает локальную область видимости.

2

Ответ на последние несколько комментариев.

Я дам вам пример сопзЬ применяется к указателям с Интс,

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; 

(Который является то, что вы изначально были)

Казалось бы, ты на самом деле не пытаются изменить указатель?

2

Я знаю из комментария, что вы хотите изменить содержание указателя, а не указатель на объект, поэтому, пожалуйста, объявите указатель ptr как const MyClass1* ptr. Это означает, что ptr является указателем, который относится к const MyClass1. Таким образом, вы можете изменить указатель, но вы не можете изменить объект, на который указывает указатель.

Смежные вопросы