C++ 如何在参数non-const中传递const指针

C++ 如何在参数non-const中传递const指针,c++,pointers,constants,param,C++,Pointers,Constants,Param,我有两个指针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*, Ve

我有两个指针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);
}
康斯特·卡斯特:你走吧

const_castvalue你去那里

您可以为此使用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));
}
您可以为此使用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));
}

最简单的答案可能是:不要。如果您需要使用Vec*而不是Vec const*,那么首先就这样声明它

如果这是一个第三方函数,它承诺不会修改它,但出于某种原因对const有反感,那么除了使用更好的第三方库之外,其他人列出的const_cast解决方案是您唯一的选择


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

最简单的答案可能是:不要。如果您需要使用Vec*而不是Vec const*,那么首先就这样声明它

如果这是一个第三方函数,它承诺不会修改它,但出于某种原因对const有反感,那么除了使用更好的第三方库之外,其他人列出的const_cast解决方案是您唯一的选择


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

正如人们提到的,您可以使用const\u cast。你必须小心这样做的原因是你可能会修改一些不应该修改的东西。例如,如果某个对象将指针声明为const,这是因为它希望确保该指针不能更改。如果你将指针转换为const_并将其传递给另一个函数,那么另一个函数可能会使它指向新的对象,从而与试图保护它的原始对象发生冲突

特别是,假设对象分配了const指针指向的内存块。如果随后通过const_cast将指针传递给函数,并且该函数删除或重新分配内存,则原始内存块将不被删除


希望这有帮助。

正如人们提到的,您可以使用const\u cast。你必须小心这样做的原因是你可能会修改一些不应该修改的东西。例如,如果某个对象将指针声明为const,这是因为它希望确保该指针不能更改。如果你将指针转换为const_并将其传递给另一个函数,那么另一个函数可能会使它指向新的对象,从而与试图保护它的原始对象发生冲突

特别是,假设对象分配了const指针指向的内存块。如果随后通过const_cast将指针传递给函数,并且该函数删除或重新分配内存,则原始内存块将不被删除


希望这能有所帮助。

我感谢你的帮助。在这里发布问题确实是一个很大的帮助。谢谢你们,我很感谢你们的帮助。在这里发布问题确实是一个很大的帮助。谢谢你们。