首页 > 解决方案 > 如何返回向量的常量引用?

问题描述

我有以下设置:

class A
{
public:
    ...
    const std::vector<int>& getSomeData() const;

private:
    std::map<SomeIdType, std::shared_ptr<SomeDataType> > m_someDataCollection;
}

A.cpp

const std::vector<int>& getSomeData(SomeIdType id) const
{
    std::vector<int> rVal;

    auto it = m_someDataCollection.find(id);
    if (it != m_someDataCollection.end())
    {
        std::shared_ptr<SomeDataType> someData = it->second;
        rVal = someData->getSomeDataVector(); // returns std::vector<int>
    }
    return  rVal;
}
int main()
{
    SomeIdType id;
    A a;
    ...
    const std::vector<int>& data = a.getSomeData(id);
}

有一个对A.cpp中返回的局部变量的引用。

我不希望返回的向量A::getSomeData()在外部被操纵。

我怎样才能实现这个目标,而不必返回对A.cpp中的局部变量的引用?

标签: c++

解决方案


如何返回向量的常量引用?

  1. 通过在函数以外的地方创建向量。由于在这种情况下它是一个成员函数,一个选项是返回对成员的引用。或者向量可以通过参数传递给函数。
  2. 或者通过使用静态局部变量。在这种情况下,函数的所有调用都将返回相同的向量。

任何非静态局部变量都不希望 A::getSomeData() 返回的向量在外部被操作。e 具有自动存储,因此仅在函数结束之前存在。对此类变量的返回引用将引用已破坏的向量。


也就是说,从您的示例看来,您可能应该按值返回向量,而不是尝试返回引用。

我不希望 A::getSomeData() 返回的向量在外部被操纵。

你没有给出你想要那个的理由。你为什么要关心调用者对你返回的向量做了什么?


推荐阅读