当函数返回它时,C++ 向量实例是可操作的

Posted

技术标签:

【中文标题】当函数返回它时,C++ 向量实例是可操作的【英文标题】:C++ vector instance is operational when function returns it 【发布时间】:2018-09-03 13:10:38 【问题描述】:

在我的课堂上,我有两个矢量对象:

std::vector<std::string> vecteur_noms_A_;
std::vector<std::string> vecteur_noms_B_;

我还有以下功能:

std::vector<std::string> & get_vecteur_noms_A_()       
 return vecteur_noms_A_;    

但我对B 没有相同的!

当我实例化我的类,并在我的类构造函数中执行以下指令时;我可以看到(通过调试或当它抛出错误时):

vecteur_noms_A_.push_back("some value"); // is ok

vecteur_noms_B_.push_back("some other value"); // is not ok <- throws an error.

调试让我看到vecteur_noms_A_ 存在对象(或实例?)(空向量),但vecteur_noms_B_ 不存在。

不清楚为什么我会观察到我没想到的行为,如果我能得到解释,我会很高兴的。

我定义一个函数这一事实是否会强制编译器实例化该对象?

这是一个例子:

#include <iostream>
#include <vector>

using namespace std;
class GP 

public:
    //Constructeur
    GP(std::vector<std::string> list_names_A, std::vector<std::string> list_names_B
);

    //Fonctions
    void construction_vecteur_A_B_(std::vector<std::string> list_names_A, std::vector<std::string> list_names_B);


    std::vector<std::string>& get_vecteur_noms_A() 
        return vecteur_noms_A_;
    

    std::vector<std::string> vecteur_noms_A_;
    std::vector<std::string> vecteur_noms_B_;
;



GP::GP(std::vector<std::string> list_names_a, std::vector<std::string> list_names_b)  

construction_vecteur_A_B_(list_names_a, list_names_b);

            


void GP::construction_vecteur_A_B_(std::vector<std::string> list_names_a,     std::vector<std::string> list_names_b)

    for (int i = 0; i < list_names_a.size(); i++) 
        vecteur_noms_A_.push_back(list_names_a[i]);
    
    for (int i = 0; i < list_names_b.size(); i++) 
        vecteur_noms_B_.push_back(list_names_b[i]);
    
    


int main()


    std::vector<std::string> list_names_A = std::vector<std::string>();
    std::vector<std::string> list_names_B = std::vector<std::string>();
    list_names_A.push_back("A");
    list_names_B.push_back("B");

GP(list_names_A, list_names_B);

    return 0;

由于这里编写的程序似乎没有错误,我想了解原因:

vecteur_noms_A_

vecteur_noms_B_

在执行时存在,以便我可以进行回击。 为什么没有必要在构造函数中对它们应用 this:

vecteur_noms_A_  = std::vector<std::string>();
vecteur_noms_B_  = std::vector<std::string>();

感谢您的帮助。

【问题讨论】:

请提供minimal reproducible example。 我认为我们需要最短的完整程序,你可以想出能够理解这一点。 好的,我会提供一个。感谢您提出这个要求 您应该阅读更多关于minimal reproducible example 的“完整”和“可验证”部分的信息。 请提供一个完整的程序,包括 main()、#includes 和其他所有内容。当你只给出 sn-ps 时,很难弄清楚发生了什么。 【参考方案1】:

关于你的最后一个问题。不必为成员向量 vecteur_noms_A_vecteur_noms_B_ 分配值,例如 std::vector&lt;std::string&gt;(),因为它们是默认构造的,当使用您的类 GP 时,在执行构造函数的主体之前.

因此请注意,如果您要在 GP 的构造函数的主体中执行以下操作:

vecteur_noms_A_  = std::vector<std::string>();
vecteur_noms_B_  = std::vector<std::string>();

相当于下面的操作:

vecteur_noms_A_.operator=(std::vector<std::string>());
vecteur_noms_B_.operator=(std::vector<std::string>());

也就是说,您正在将一个空向量(使用复制赋值运算符)分配给您已经默认构造的空向量,这是多余的。

【讨论】:

感谢 Alexander 提供这些元素。我知道类的成员将被默认构造,除非在构造函数定义中的“:”之后设置了特定的构造。你知道一种方法,这可能会导致非默认构造 vecteur_noms_B_ 吗?这似乎是 3 天前发生在我身上的事情,但我无法重现导致它的原因(参见这个 *** 问题的第一部分)。谢谢 很遗憾,正如cmets中其他人所提到的,没有办法重现您遇到的错误,或者更清楚地了解抛出错误所需的步骤,无法多说。创建向量时,您不需要使用默认构造函数,向量类有其他构造函数(en.cppreference.com/w/cpp/container/vector/vector)但不清楚与您报告的问题有什么关系。

以上是关于当函数返回它时,C++ 向量实例是可操作的的主要内容,如果未能解决你的问题,请参考以下文章

使用非静态成员函数的 C++ 排序向量

c++向量构造函数实例化冲突

从函数 C++ 返回向量

函数返回类型是 C++ 中的向量

Cython - 将 C++ 函数返回的 C++(向量和非向量)对象暴露给 Python

从 C++ 中的函数返回向量或数组