C/C++:Const 结构中的指针
如何强制函数 fn 中 obj->val1 指向的内存保持常量?
#include <iostream>
struct foo {
int* val1;
int* val2;
int* val3;
};
void fn( const foo* obj )
{
// I don't want to be able to change the integer that val1 points to
//obj->val1 = new int[20]; // I can't change the pointer,
*(obj->val1) = 20; // But I can change the memory it points to...
}
int main(int argc, char* argv[])
{
// I need to be able to set foo and pass its value in as const into a function
foo stoben;
stoben.val1 = new int;
*(stoben.val1) = 0;
std::cout << *(stoben.val1) << std::endl; // Output is "0"
fn( &stoben );
std::cout << *(stoben.val1) << std::endl; // Output is "20"
delete stoben.val1;
return 0;
}
这里的代码非常不言自明。我需要能够创建一个非常量对象并用数据填充它,然后将其传递给无法修改该数据的函数。我该怎么办?
我知道我可以只传递一个 const int 指针,但理论上,这个类包含我在“fn”中也需要的几个其他指针。
谢谢,
格里夫
How do I force const-ness of the memory pointed to by obj->val1 in the function fn?
#include <iostream>
struct foo {
int* val1;
int* val2;
int* val3;
};
void fn( const foo* obj )
{
// I don't want to be able to change the integer that val1 points to
//obj->val1 = new int[20]; // I can't change the pointer,
*(obj->val1) = 20; // But I can change the memory it points to...
}
int main(int argc, char* argv[])
{
// I need to be able to set foo and pass its value in as const into a function
foo stoben;
stoben.val1 = new int;
*(stoben.val1) = 0;
std::cout << *(stoben.val1) << std::endl; // Output is "0"
fn( &stoben );
std::cout << *(stoben.val1) << std::endl; // Output is "20"
delete stoben.val1;
return 0;
}
The code here is pretty self explanitory. I need to be able to make a non-const object and fill it with data, but then pass it to a function where this data cannot be modified. How can I go about this?
I know I can just pass in a const int pointer, but theoretically, this class contains several other pointers which I will need in "fn" as well.
Thanks,
Griff
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
由于您标记为 C++,因此您可以将成员设为
private
并创建一个返回const int *
的访问器。您最初可以通过构造函数或friend
函数设置该成员。Since you tagged as C++, you could make the member
private
and make an accessor that returns aconst int *
. You could originally set the member via your constructor or afriend
function.我不是 C++ 人员,但在 C 中,我会通过两种不同的结构声明来处理这个问题,一种是公共的,一种是私有的:
当我尝试使用 GCC 编译上述内容时,我收到以下编译器错误,因为我'我试图修改只读内存:
I'm not a C++ person, but in C, I'd handle this through two different struct declarations, one public, one private:
When I try to compile the above w/ GCC, I get the following compiler errors, since I'm trying to modify read-only memory:
你真的不能。 const foo 指定里面的成员是 const,即它们是指向整数的常量指针,而不是指向常量整数的指针。
对此的正确解决方案是通过封装、隐藏这些成员并提供公共接口。如果您被禁止修改 struct foo,一个实用的解决方案是通过私有继承:
当然,您需要创建适当的构造函数等,以便可以设置原始 foo。
You really can't. A const foo specifies that the members inside are const, that is, they are constant pointers to integers, not pointers to constant integers.
The proper solution to this would be via encapsulation, hiding these members and providing a public interface. A practical solution, should you be forbidden to modify the struct foo, would be through private inheritance:
Of course, you would need to create the appropriate constructors, etc., so that the original foo can be set up.