ошибка сегментации после печати матрицы, но исправлена ​​после печати дополнительной строки (ostream << opertator) - PullRequest
0 голосов
/ 06 мая 2018

После создания матрицы и ее распечатки я получаю ошибку сегментации ... Все символы моей матрицы печатаются, но после последней строки, которую я печатаю:

std::cout << endl;

и я получаю ошибку сегментации.

Мой код:

Заголовок:

class Board{

    private:
        struct coord {
            int x;
            int y;
        };
        coord _coord;

        char** board;
        int size;

    public:

        Board(int v);   
        //~Board();
        friend std::ostream& operator<<(std::ostream& os, Board const &b); 
};

Мой код CPP:

Board::Board(int v)
{
    size = v;
    board = new char* [size];

    for (int i=0; i<size; i++)
    {
        board[i] = new char[size];
        for(int j = 0 ; j < size ; j++){
            board[i][j] = '*';
        }
    }
}

ostream& operator<<(std::ostream& os, Board const &b)

    {
        for(int i = 0 ; i < b.size ; i++){
            for(int j = 0 ; j < b.size ; j++){
                cout << b.board[i][j] << " ";
            }
            cout << endl; // when (i == 3) the debug tells me after this I am thrown out
        }
        //cout << " "  << endl;

    }

Моя главная:

#include "Board.h"
#include <iostream>
#include <vector>
//#include <map>
using namespace std;

int main() {
    Board board1{4};  // Initializes a 4x4 board
    cout << board1 << endl; 
    return 0;
}

Тогда я получаю:

* * * * 
* * * * 
* * * * 
* * * * 
Segmentation fault

но если я откомментирую: "// cout <<" "<< endl;" </strong> У меня больше нет ошибки сегментации.

Где проблема? это выглядит слишком просто, но я получаю сообщение об ошибке. (С дополнительной надписью << "" << endl; строку я могу продолжить и дать свое задание, но я считаю, что я должен узнать больше и выяснить проблему) </p>

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

1 Ответ

0 голосов
/ 06 мая 2018

Это даже компилируется? Вы пропустили оператор возврата << оператор перегрузки. Ваша реализация также неверна, вы должны использовать ostream, переданный функции для печати, а не напрямую использовать cout и затем вернуть его: </p>

    friend ostream& operator<<(std::ostream& os, Board const &b)
    {
        for (int i = 0; i < b.size; i++) {
            for (int j = 0; j < b.size; j++) {
                os << b.board[i][j] << " ";
            }
            os << endl; // when (i == 3) the debug tells me after this I am thrown out
        }

        os << " "  << endl;
        return os;
    }

cout - это один из доступных объектов ostream (есть также cerr и clog), и вы хотите, чтобы ваш оператор поддерживал их все. При этом вам следует использовать контейнеры STL вместо необработанных указателей.

...