Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何防止函数从非常量访问指针对象中过滤指针向量?_C++_Pointers_Constants - Fatal编程技术网

C++ 如何防止函数从非常量访问指针对象中过滤指针向量?

C++ 如何防止函数从非常量访问指针对象中过滤指针向量?,c++,pointers,constants,C++,Pointers,Constants,我有一个函数,它过滤指针向量,返回经过筛选的版本。根据其参数的性质(类型为常量向量&),它可以更改指针指向的数据结构。有没有办法使其无法通过指针更改数据,同时仍然能够返回向量,即其参数的过滤版本?您有一个一元函数: (const vector<Data*>&) 然后,这样称呼它: filter(vec.data(), vec.size()); 现在,您的函数正在接受指向const Data的指针,因此无法更改它们。打电话的人不需要做任何特别的事情。如果要保留旧的调用样式,

我有一个函数,它过滤指针向量,返回经过筛选的版本。根据其参数的性质(类型为
常量向量&
),它可以更改指针指向的
数据
结构。有没有办法使其无法通过指针更改
数据
,同时仍然能够返回
向量
,即其参数的过滤版本?

您有一个一元函数:

(const vector<Data*>&)
然后,这样称呼它:

filter(vec.data(), vec.size());
现在,您的函数正在接受指向
const Data
的指针,因此无法更改它们。打电话的人不需要做任何特别的事情。如果要保留旧的调用样式,可以制作包装器:

filter(const vector<Data*>& vec) {
  return filter(vec.data(), vec.size());
}

所有这些都不能提供“完美”的安全性,但是,
const
永远不能

您可以使用一些指针包装器,当取消引用并成为
const
时,它将
const&
返回给指针对象。原始指针和智能指针返回可变引用您在代码中允许什么来实现这一点?不能直接执行。@black函数的参数可以修改,函数的源也可以修改。甚至打电话的人也可以。它只是需要或多或少的简单易懂(并且可以扩展)。
vec.data()
将是一个
data**
,不是吗?(或
Data*const*
,对于const-qualified
vec
)@T.C.:谢谢,我已经解决了这个问题。我现在已经编译了答案中的代码。:)
filter(const vector<Data*>& vec) {
  return filter(vec.data(), vec.size());
}
vector<Data*> filter(const Data* const* data, size_t size) {
  vector<Data*> results;
  for (size_t ii = 0; ii < size; ++ii) {
    results.push_back(const_cast<Data*>(data[ii]));
  }
  return results;
}