返回对类成员容器的元素的引用
Returning a reference to an element of a class member container
Foo的行为类似于循环迭代器。 尽管我对此感到紧张,但下面的代码编译良好,但会产生运行时错误。 即使我从 get_current() 中删除常量,我也会收到错误。 当然,我可以返回一个指针,它会起作用;但是,返回引用后会获得更好的安全性吗?
#include <iostream>
#include <array>
#include <memory>
class Foo
{
public:
Foo();
void next();
const int& get_current() const;
private:
std::array<std::unique_ptr<int>, 3> arr_;
unsigned i_;
};
Foo::Foo() : i_(0)
{
arr_[0] = std::unique_ptr<int>(new int(5));
arr_[1] = std::unique_ptr<int>(new int(6));
arr_[2] = std::unique_ptr<int>(new int(7));
}
void Foo::next()
{
++i_;
i_ %= 3;
}
const int& Foo::get_current() const
{
return *arr_[i_];
}
int main()
{
Foo foo;
int* p;
*p = foo.get_current();
//do something with p
std::cout << *p << std::endl;
foo.next();
*p = foo.get_current();
//do something with p
std::cout << *p << std::endl;
return 0;
}
int* p;
这是一个未初始化的指针,不指向任何内容。取消引用它会给出未定义的行为。
*p = foo.get_current();
这将取消引用无效指针。繁荣!
也许您希望它指向数组元素
p = &foo.get_current();
或者,您可能想要数组元素的副本
int n;
n = foo.get_current();
foo.get_current();
很可能返回一个const
引用,但之后你在分配给*p
时尝试获取它的值副本。
分配给*p
是导致您麻烦的原因,因为p
未初始化。这是未定义的行为,在您的情况下表现为运行时错误。
您可以使用像const int& p = foo.get_current();
这样的代码,但请注意,一个引用只能绑定一次,因此您必须小心范围。
或者,您可以使用std::shared_ptr<int>
并将其作为get_current()
的返回类型,并完全去除代码中的裸指针。
*p = ...
您在没有正确初始化的情况下取消引用int* P
。
将 main 中的代码更改为
int p; // Remove *
p = foo.get_current();
//do something with p
std::cout << p << std::endl;
或者如果你真的想使用指针
const int* p;
p = &foo.get_current();
// ^ Take the address
相关文章:
- 向量元素的引用地址与它所指向的向量元素的地址不同.为什么
- 使用运算符 [] 引用 std::vector 上最后一个元素时出现问题<>
- 设计将引用元素移动到开头的数据结构.C++
- 为什么通过 vector<reference_wrapper> 的元素删除引用的值<T>不会使向量无效?
- 将新元素添加到列表中,并返回对该元素的引用?
- 如何告诉自动推断向量<bool>元素的非引用类型
- 通过引用访问矢量元素是否会降低C++的空间复杂性?
- 通过引用传递时访问std::vector的元素
- 如何取消引用和打印指针数组的每个元素?
- 如何从模板获取常量矢量元素的引用
- 调整大小后保持对矢量元素的引用有效
- 取消引用C++中的指针元素
- 在这种情况下,如何返回对数组中元素的引用?
- C++ - 返回对矢量元素的引用
- 引用保留向量中的第一个元素
- C++ 当容器在使用前被破坏/修改时发出警告(通过引用元素或迭代器使用)
- 如何通过引用对用户定义对象的类型集 (STL) 的数组元素进行增强迭代?
- 如何理解取消引用指向数组的指针会获取指向元素的指针
- 如何将一个向量的元素引用复制到另一个向量?
- 通过[]运算符返回矢量元素引用