1

我在给定的一段代码中有两个指针(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);
}
4

4 回答 4

3

最简单的答案可能是:“不要”。如果您需要使用 aVec *而不是 a Vec const *,那么首先以这种方式声明它。

如果这是某个承诺不会修改它但由于某种原因constconst_cast.

如果std::vector你所指向的指针实际上不是const(在它的声明点),而你恰好有一个指向它的指针std::vector const *,那么在它上面使用它是“安全的”(但通常仍然是不明智的)const_cast。但是,如果您修改任何最初声明为 is 的变量const,则它是未定义的行为。例如,编译器可能会看到您std::vector const多次执行一些昂贵的操作,并且可以自由缓存结果的某些部分,因为它可以假设它总是在处理相同的事情,所以如果您更改它,您可能会得到不正确(甚至不一致)的结果。

于 2012-05-10T23:51:07.277 回答
2

您可以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));
}
于 2012-05-10T23:48:17.087 回答
1

const_cast<type>(value)你去吧;)

于 2012-05-10T23:48:08.950 回答
0

正如人们所提到的,您可以使用const_cast. 您必须小心执行此操作的原因是您最终可能会修改不应修改的内容。例如,如果某个对象按原样声明一个指针,const因为它想确保该指针不能更改。如果您然后const_cast将指针传递给另一个函数,则另一个函数可以使其指向新的东西,从而与试图保护它的原始对象发生冲突。

特别是,如果对象 A 分配了一些 const 指针指向的内存怎么办。如果你将指针传递给一个函数,const_cast并且这个函数delete是内存,或者重新存储alloc它,那么原始内存块将存在且未被删除。

希望这可以帮助。

于 2012-05-11T00:53:02.530 回答