VS2010 C++ - 按引用传递结构向量未按预期工作
VS2010 C++ - Passing Vector of Structures by Reference Not Working as Expected
所以我有一个困惑的问题,希望一些专家能够回答。我有一个包含结构的结构和包含位集的向量。这里不打算全部列出,但结构定义如下所示:
typedef struct _signal_data_t
{
signal_map_t sigMap;
vector<sigDataType> vSignalData;
vector<sigDataType> vChangeColor;
} signal_data_t;
我在 class 中声明了一个向量。
vector<signal_data_t> m_pSignalData;
然后我在调用一个函数时使用这个向量,这个函数应该用它的所有信息填充这个向量(它正确地完成了)。
CDlgStlFindProcedure mDlgStlFindProcedure(m_pSignalData, m_szVectorFilename);
class CDlgStlFindProcedure 使用引用传递。
头文件:
CDlgStlFindProcedure(vector<signal_data_t> &pSignalData, CString szInfile, CWnd* pParent = NULL); // standard constructor
Cpp 文件:
CDlgStlFindProcedure::CDlgStlFindProcedure(vector<signal_data_t> &pSignalData, CString szInfile, CWnd* pParent /*=NULL*/)
: CDialog(CDlgStlFindProcedure::IDD, pParent)
, m_pSignalData(pSignalData)
{
szFilename = szInfile;
}
我在 CDlgStlFindProcedure class 完成时设置了一个断点,并且 m_pSignalData 是正确的。我在returns和m_pSignalData为空的时候设置了一个断点。我很确定我正确地使用了按引用传递,因为我已经将它用于矢量以外的许多项目。在这里和其他地方的研究表明应该可以通过引用传递向量,但它在我的应用程序中不起作用。
我可以修改为通过指针传递然后它起作用,但这似乎比通过引用传递更笨拙。有什么建议么?我做错了什么吗?
提前致谢。
编辑
我被否决了,我想这意味着每个人都认为这是一个愚蠢的问题,但我很困惑为什么。参考:
https://www.geeksforgeeks.org/passing-vector-function-cpp/
// C++ program to demonstrate how vectors
// can be passed by reference.
#include<bits/stdc++.h>
using namespace std;
// The vect is passed by reference and changes
// made here reflect in main()
void func(vector<int> &vect)
{
vect.push_back(30);
}
int main()
{
vector<int> vect;
vect.push_back(10);
vect.push_back(20);
func(vect);
for (int i=0; i<vect.size(); i++)
cout << vect[i] << " ";
return 0;
}
输出:
10 20 30
我的用法与上面的代码有何不同?
在你的构造函数中,你复制了向量,而不是引用。
CDlgStlFindProcedure::CDlgStlFindProcedure(vector<signal_data_t> &pSignalData, CString szInfile, CWnd* pParent /*=NULL*/)
: CDialog(CDlgStlFindProcedure::IDD, pParent)
, m_pSignalData(pSignalData) // copying pSignalData into m_pSignalData
如果您确实需要参考,请这样做:
vector<signal_data_t> &m_pSignalData;
但是请记住,这是一种非常糟糕的风格
所以我有一个困惑的问题,希望一些专家能够回答。我有一个包含结构的结构和包含位集的向量。这里不打算全部列出,但结构定义如下所示:
typedef struct _signal_data_t
{
signal_map_t sigMap;
vector<sigDataType> vSignalData;
vector<sigDataType> vChangeColor;
} signal_data_t;
我在 class 中声明了一个向量。
vector<signal_data_t> m_pSignalData;
然后我在调用一个函数时使用这个向量,这个函数应该用它的所有信息填充这个向量(它正确地完成了)。
CDlgStlFindProcedure mDlgStlFindProcedure(m_pSignalData, m_szVectorFilename);
class CDlgStlFindProcedure 使用引用传递。 头文件:
CDlgStlFindProcedure(vector<signal_data_t> &pSignalData, CString szInfile, CWnd* pParent = NULL); // standard constructor
Cpp 文件:
CDlgStlFindProcedure::CDlgStlFindProcedure(vector<signal_data_t> &pSignalData, CString szInfile, CWnd* pParent /*=NULL*/)
: CDialog(CDlgStlFindProcedure::IDD, pParent)
, m_pSignalData(pSignalData)
{
szFilename = szInfile;
}
我在 CDlgStlFindProcedure class 完成时设置了一个断点,并且 m_pSignalData 是正确的。我在returns和m_pSignalData为空的时候设置了一个断点。我很确定我正确地使用了按引用传递,因为我已经将它用于矢量以外的许多项目。在这里和其他地方的研究表明应该可以通过引用传递向量,但它在我的应用程序中不起作用。
我可以修改为通过指针传递然后它起作用,但这似乎比通过引用传递更笨拙。有什么建议么?我做错了什么吗?
提前致谢。
编辑
我被否决了,我想这意味着每个人都认为这是一个愚蠢的问题,但我很困惑为什么。参考:
https://www.geeksforgeeks.org/passing-vector-function-cpp/
// C++ program to demonstrate how vectors
// can be passed by reference.
#include<bits/stdc++.h>
using namespace std;
// The vect is passed by reference and changes
// made here reflect in main()
void func(vector<int> &vect)
{
vect.push_back(30);
}
int main()
{
vector<int> vect;
vect.push_back(10);
vect.push_back(20);
func(vect);
for (int i=0; i<vect.size(); i++)
cout << vect[i] << " ";
return 0;
}
输出: 10 20 30
我的用法与上面的代码有何不同?
在你的构造函数中,你复制了向量,而不是引用。
CDlgStlFindProcedure::CDlgStlFindProcedure(vector<signal_data_t> &pSignalData, CString szInfile, CWnd* pParent /*=NULL*/)
: CDialog(CDlgStlFindProcedure::IDD, pParent)
, m_pSignalData(pSignalData) // copying pSignalData into m_pSignalData
如果您确实需要参考,请这样做:
vector<signal_data_t> &m_pSignalData;
但是请记住,这是一种非常糟糕的风格