Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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++_Oop_Vector - Fatal编程技术网

C++ 用返回空向量的对象填充向量

C++ 用返回空向量的对象填充向量,c++,oop,vector,C++,Oop,Vector,我有一个成员函数,它用对象填充向量: std::vector<OptionData>& OptionData::createMeshExpiry(const double T_start, const double T_end, double T_increment) { // Ouput a vector filled with option data spread std::vector<OptionData> optData; m_T =

我有一个成员函数,它用对象填充向量:

std::vector<OptionData>& OptionData::createMeshExpiry(const double T_start, const double T_end, double T_increment)
{ // Ouput a vector filled with option data spread 
    std::vector<OptionData> optData;
    m_T = T_start; // intialize to first value 
    while(m_T <= T_end)
    {
        optData.push_back(*this); // push the current instance onto the vector 
        m_T += T_increment; // increment expiry time 
    }
    return optData; // return by reference to enable a cascading effect (if needed to change more than one var)
}
无论while循环运行多少次,函数始终返回一个空向量。这意味着我的while循环什么都不做。这怎么可能


编辑:在玩了一段时间代码之后,我注意到问题是通过引用返回的。但为什么通过引用返回会导致此问题

您正在返回局部变量的引用,这就是问题所在。局部变量optData的作用域仅在函数内部,一旦到达函数的最后一个括号,系统将调用它的析构函数

所以需要进行修正,将其更改为按值返回,剩下的部分将处理NRVO。因此,按如下方式更改函数

std::vector<OptionData> OptionData::createMeshExpiry(const double T_start, const double T_end, double T_increment)
{
 //....
}

您正在返回局部变量的引用,这就是问题所在。局部变量optData的作用域仅在函数内部,一旦到达函数的最后一个括号,系统将调用它的析构函数

所以需要进行修正,将其更改为按值返回,剩下的部分将处理NRVO。因此,按如下方式更改函数

std::vector<OptionData> OptionData::createMeshExpiry(const double T_start, const double T_end, double T_increment)
{
 //....
}

谢谢,但是为什么引用返回会引起这个问题?@瑞恩C++引用总是弱引用。当它们指向的原始对象超出范围或被删除时,它们会变坏。如果需要更强的引用方案,可以考虑返回SysDypTR。但是,由于RVO,简单地按值返回是很快的。谢谢,但是为什么引用返回会引起问题?@ RANIC++引用总是弱引用。当它们指向的原始对象超出范围或被删除时,它们会变坏。如果需要更强的引用方案,可以考虑返回SysDypTR。但是,由于RVO的原因,简单地按值返回速度很快。请启用编译器警告,然后读取它们。这些警告正试图起到帮助作用。真的。离题:如果你知道你的向量需要有多大,并且你能有效地做到这一点,那么在向量前面初始化或保留足够的空间通常是个好主意。否则,您将得到大量的重新分配。请启用编译器警告,然后读取它们。这些警告正试图起到帮助作用。真的。离题:如果你知道你的向量需要有多大,并且你能有效地做到这一点,那么在向量前面初始化或保留足够的空间通常是个好主意。否则,您将得到大量的重新分配。