2012-05-10 1 views
1

У меня есть два указателя (const Vec * a и const Vec b) в данном фрагменте кода, мне нужно передать эти два значения, которые создаются во время кода, для функции, которая не имеет параметра (const Vec *), но только (Vec *). Как я могу это сделать без изменения определения функции, но при необходимости, какую процедуру я должен выполнить?Как передать указатель const в параметре non-const

//const Vec* from; 
//const Vec* at; 
Vec* viewVec; 
viewVec = Vec::sub(view->at, view->from); 


//static Vec* sub(Vec*, Vec*); 
Vec* Vec::sub(Vec* a, Vec* b) { 
    return new Vec(a->x - b->x, a->y - b->y, a->z - b->z); 
} 

ответ

1

Вы можете использовать const_cast для этого, например,

viewVec = Vec::sub(const_cast<Vec*>(view->at), const_cast<Vec*>(view->from)); 

Нужно ли вам другое дело. Если вы действительно не можете изменить подпись функции (это, вероятно, самое простое исправление), вы всегда можете написать обертку, содержащую изворотливое кастинг - таким образом, по крайней мере, вызывающему не нужно делать какое-либо литье:

Vec *Vec::sub(const Vec *a, const Vec *b) { 
    return sub(const_cast<Vec*>(view->at), const_cast<Vec*>(view->from)); 
} 
+1

Я благодарен вам за помощь. Это действительно помогло мне задавать вопросы здесь. Спасибо вам, ребята. –

2

Самый простой ответ, вероятно: «не надо». Если вам нужно использовать Vec * вместо Vec const *, тогда объявите его таким образом, чтобы начать.

Если это какая-то третья сторона, которая обещает не изменять ее, но по какой-то причине имеет отвращение к const, то решения const_cast, которые перечислены другими людьми, являются вашим единственным выбором (кроме использования лучшей сторонней библиотеки).

Если std::vector, что указатель у вас есть очки на самом деле не const (в точке его декларации), и вы просто так, чтобы иметь std::vector const *, что относится к нему, то это «безопасный» (но все же в целом неразумно) для использования const_cast. Однако, если вы изменяете любую переменную, которая изначально была объявлена ​​как const, тогда это неопределенное поведение. Например, компилятор может увидеть, что вы несколько раз выполняете дорогостоящую операцию на std::vector const, и он может кэшировать определенные части результата, потому что он может предположить, что он всегда имеет дело с одним и тем же, поэтому, если вы его измените, вы могут получить неправильные (или даже несогласованные) результаты.

0

Как уже упоминалось, вы можете использовать const_cast. Причина, по которой вы должны быть осторожны, заключается в том, что вы можете изменить то, что не должно быть изменено. Например, если какой-либо объект объявляет указатель как const, это связано с тем, что он хочет, чтобы этот указатель не мог измениться. Если вы затем указали const_cast указатель и передали его другой функции, другая функция могла бы указывать на что-то новое, отвинчивая исходный объект, который пытался его защитить.

В частности, что, если объект A выделяет некоторую часть памяти, на которую указывает указатель const. Если вы затем передадите указатель на функцию через const_cast, и эта функция будет сохранена в памяти или восстановлена, то исходный кусок памяти будет восстановлен.

Надеюсь, это поможет.

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

  • Нет связанных вопросов^_^