我有两个指针(const Vec * a和const Vec b) 在给定的代码片段中,我需要传递这两个值,这些值在代码期间被实例化,用于没有参数(const Vec *)但只有(Vec *)的函数。 如果不移动函数定义,我怎么能这样做,但如果有必要,我应该采取什么程序?
//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);
}
答案 0 :(得分:2)
最简单的答案可能是:“不要”。如果您需要使用Vec *
而不是Vec const *
,请以此方式声明。
如果这是某些承诺不修改它的第三方功能但由于某种原因而厌恶const
,那么其他人列出的const_cast
解决方案是您唯一的选择(除了使用更好的第三方库。)
如果您指向的指针std::vector
实际上不是const
(在声明点),而您恰好有std::vector const *
引用它,那么在它上面使用const_cast
是“安全的”(但通常仍然是不明智的)。但是,如果您修改最初声明为const
的任何变量,那么它是未定义的行为。例如,编译器可能会看到您在std::vector const
多次执行一些昂贵的操作,并且可以自由地缓存结果的某些部分,因为它可以假设它总是处理相同的事情,所以如果你改变它,你可能得到不正确(甚至不一致)的结果。
答案 1 :(得分: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));
}
答案 2 :(得分:0)
const_cast<type>(value)
你去;)
答案 3 :(得分:0)
正如人们提到的,你可以使用const_cast
。您必须小心这样做的原因是您最终可能会修改不应修改的内容。例如,如果某个对象将指针声明为const
,那是因为它希望确保此指针不能更改。如果你然后const_cast
指针并将其传递给另一个函数,那么另一个函数可以使它指向一个新的东西,因此拧紧试图保护它的原始对象。
特别是,如果对象A分配了const指针指向的某段内存,该怎么办?如果你然后通过const_cast
将指针传递给一个函数并且这个函数delete
是内存,或者重新alloc
它,那么原始的内存将会被取消删除。
希望这有帮助。