Разреженный матричный конструктор не сохраняет параметры в объекте - PullRequest
0 голосов
/ 10 ноября 2018

Я хочу сохранить разреженную матрицу, прочитанную из файла, но когда конструктор завершает работу, параметры не сохраняются в объекте.

Файл имеет структуру "row col", где row - строка матрицы, а col - столбец матрицы.Если координата файла существует, он хранит 1 в этой позиции, в противном случае он хранит 0.

Это конструктор:

MatriuSparse::MatriuSparse(const string nomFitxer) {
        fstream fitxer;
        fitxer.open(nomFitxer);

        int m_columna;
        int m_fila;
        m_Ncolumnes = 8;
        m_Nlinies = 8;
        vector<vector<int> > matriu;
        for (int i = 0; i < m_Nlinies; i++)
        {
            vector<int> temporal;
            for (int j = 0; j < m_Ncolumnes; j++) {
                temporal.push_back(0);
            }
            matriu.push_back(temporal);
        }
        fitxer >> m_fila >> m_columna;

        while (!fitxer.eof())
        {
            matriu[m_fila][m_columna] = 1;
            fitxer >> m_fila >> m_columna;
        }
        fitxer.close();
        //Here matrix has size 8
    }

И это главное:

 string nomFitxer = "Xarxa1.txt";
    MatriuSparse m1(nomFitxer);
    // Here m1 matrix has size 0
    cout << m1;

Ответы [ 2 ]

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

Ваша основная проблема в том, что вам нужно сделать matriu членом класса, а не объявлять его локально в функции.

Кроме того, у меня есть еще несколько комментариев.

Если вы заранее знаете, что размер матрицы составляет 8x8, использовать vector - это избыточно, используйте array.

Соглашение об именах немного странное. Я предполагаю, что вы используете m_ для обозначения переменных-членов, но m_columna и m_fila являются локальными переменными.

Вы упоминаете разреженную матрицу, но заполняемая вами матрица matriu имеет плотный формат.

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

Ваш конструктор не хранит ничего в классе, кроме m_Ncolumnes и m_Nlinies, которые вы устанавливаете в постоянное значение. Все остальное хранится в переменных, которые являются локальными для конструктора и которые исчезают после завершения конструктора.

Весьма вероятно, что вы прячете вектор-член с таким же именем. Просто удалите эту строку:

    vector<vector<int> > matriu;   // hiding the member matriu ? 

Не связано 1: Вы можете легко инициализировать свой вектор без вложенного цикла:

    matriu = vector<vector<int>>(m_Nlinies, vector<int>(m_Ncolumnes, 0));

Не связано 2 : зацикливание на eof() не работает должным образом. Вы должны зацикливаться на извлечении. Поэтому, как только ваша матрица будет инициализирована, просто выполните:

    while (fitxer >> m_fila >> m_columna)
    {
        matriu[m_fila][m_columna] = 1;
    }
...