在函数c ++中通过引用传递的指针参数
Posted
技术标签:
【中文标题】在函数c ++中通过引用传递的指针参数【英文标题】:pointer parameter passed by reference in a function c++ 【发布时间】:2019-01-06 18:31:08 【问题描述】:我有一个类模板,它有一个成员变量std::vector<T> buffer
和一个成员函数setData
等等。
template <class T>
void ArrayT<T>::setData(const std::vector<T> * & data_ptr)
buffer.assign(data_ptr->begin(), data_ptr->end());
我希望setData
对作为其参数传递的数据执行深层复制。如你所见,参数是* &
类型,如果我理解得很好,它是一个通过引用传递的指针参数。
当我写作时:
vector<float> vec(3, 1.0);
vector<float>* vec2 = &vec;
A obj();
obj.setData(vec2);
我收到一个错误:
E0434 “const std::vector
> *&” 类型的引用(非 const 限定)不能用“std::vector > *"
有人能解释一下如何解决这个问题吗?
【问题讨论】:
@JesperJuhl 有很多理由这样做。但是,它们在这里都不明显。 【参考方案1】:setData()
的输入参数是对指向 const std::vector
的非常量指针的引用。但是您指向的std::vector
对象不是const
。
在这种情况下根本没有理由使用指针。将 setData()
更改为通过 const 引用获取 std::vector
:
template <class T>
void ArrayT<T>::setData(const std::vector<T> &data)
buffer.assign(data.begin(), data.end());
// or simply: buffer = data;
vector<float> vec(3, 1.0);
Array<float> obj;
obj.setData(vec);
话虽如此,如果要保留指针,则需要删除const
:
template <class T>
void ArrayT<T>::setData(std::vector<T> * data_ptr)
buffer.assign(data_ptr->begin(), data_ptr->end());
// or simply: buffer = *data_ptr;
或者至少将const
移动到*
之后,以使指针本身成为const
,而不是它指向的对象:
template <class T>
void ArrayT<T>::setData(std::vector<T> * const data_ptr)
buffer.assign(data_ptr->begin(), data_ptr->end());
// or simply: buffer = *data_ptr;
无论哪种方式,请注意我删除了引用。当您不修改指针指向的内容时,没有充分的理由通过引用传递指针。而是按值传递指针。
【讨论】:
如果我将指针保留在参数类型中,是否有解决方案?还是它错了,我一定要删除它? 谢谢!我想我现在理解得更好了以上是关于在函数c ++中通过引用传递的指针参数的主要内容,如果未能解决你的问题,请参考以下文章