VS2010 C ++ - Передача вектора структур по ссылке не работает должным образом - PullRequest
0 голосов
/ 15 ноября 2018

Итак, у меня возникла озадачивающая проблема, на которую, надеюсь, некоторые эксперты смогут ответить.У меня есть структура, содержащая структуры и векторы, содержащие наборы битов.Не буду перечислять все здесь, но определение структуры выглядит следующим образом:

typedef struct _signal_data_t
{
    signal_map_t        sigMap;
    vector<sigDataType> vSignalData;
    vector<sigDataType> vChangeColor;
} signal_data_t;

Я объявляю вектор в своем классе.

vector<signal_data_t>           m_pSignalData;

Затем я использую этот вектор при вызове функции, котораяожидается, что этот вектор заполнится всей его информацией (что он делает правильно).

CDlgStlFindProcedure mDlgStlFindProcedure(m_pSignalData, m_szVectorFilename);

Класс 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, и m_pSignalData верен.Я установил точку останова, когда она вернется, и m_pSignalData будет пустым.Я почти уверен, что правильно использую передачу по ссылке, поскольку использовал ее для ряда элементов, кроме векторов.Исследования здесь и в других местах показывают, что можно передавать векторы по ссылке, но это не работает в моем приложении.

Я могу изменить, чтобы передать по указателю, и тогда это сработает, но это кажется неуклюжимзатем переходя по ссылке.Какие-либо предложения?Я что-то не так делаю?

Заранее спасибо.

edit

Мне снимают голосование, что, я думаю, означает, что все думают, что это глупый вопрос, ноЯ очень смущен, почему.Ссылаясь на:

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

Чем мое использование отличается от кода выше?

1 Ответ

0 голосов
/ 15 ноября 2018

В вашем конструкторе вы создаете копию вектора, а не ссылку.

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;

, но помните, что этоочень плохой стиль

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...