Матрица очистки функций-членов C ++

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

Вот мой заголовочный файл, содержащий информацию о классе:

#ifndef TTT_H
#define TTT_H

#include <cstdlib>
#include <iostream>

using namespace std;

class TicTacToe
{
private:
    enum Status{WinX, WinO, Continue, Draw};
    int **board;

public:
    TicTacToe();
    ~TicTacToe();
    void PrintBoard();
    bool ValidMove(int, int);
    bool PlayerMove(int, int, int);
    Status GameStatus();    //this one causes the problem
    void Debug();
};

#endif 

Вот код файла CPP с определениями функций-членов:

#include "TicTacToe.h"
#include <iostream>
#include <cstdlib>
#include <iomanip>
#include <cassert>

using namespace std;

TicTacToe::TicTacToe() 
{
    board = new int*[3];
    assert(board != 0);

    for(int i=0;i<3;i++)
    {
        cout << "Constructor Ran again" << endl;    //for testing
        board[i] = new int[3];
        assert(board[i] != 0);
        for(int j=0;j<3;j++)
            board[i][j] = 9;
    }
}

TicTacToe::TicTacToe(TicTacToe &copy)
{
    board = new int*[3];
    assert(board != 0);
}

TicTacToe::~TicTacToe()
{
    if(board)
        delete[] board;
}

void TicTacToe::PrintBoard() 
{
    for(int i=0;i<3;++i)
    {
        for(int j=0;j<3;++j)
        {
            cout << "| ";

            switch(board[i][j]){
            case 0:
                cout << "O ";
                break;
            case 1:
                cout << "X ";
                break;
            case 9:
                cout << "  ";
                break;
            }
        }
        cout << "|" << endl;
        cout << "------------" << endl;
    }
}

bool TicTacToe::ValidMove(int row, int col) 
{
    bool valid = false;
    if(row < 3 && col < 3)
    {
        if(board[row][col] == 9)
            valid = true;
    }
    return valid;
}

bool TicTacToe::PlayerMove(int player, int row, int col) 
{
    bool done = false;

    if(ValidMove(row,col) == true)
    {
        if(player == 1)
            board[row][col] = 1;
        else
            board[row][col] = 0;
        done = true;
    }

    return done;
}

TicTacToe::Status TicTacToe::GameStatus() //This function is the problem
{
    int check, empty = 0;
    bool done = false;

    for(int i=0;i<3;++i)
    {
        for(int j=0;j<3;++j)
        {
            check += board[i][j];
            if(board[i][j] = 9)
                empty++;
        }
        if(check == 0)
            return WinO;
        else if(check == 3)
            return WinX;
        check = 0;
    }

    if(empty == 0)
        return Draw;

    for(int i=0;i<3;++i)
    {
        for(int j=0;j<3;++j)
            check += board[j][i];
        if(check == 0)
            return WinO;
        else if(check == 3)
            return WinX;
        check = 0;
    }

    check = board[0][0] + board[1][1] + board[2][2];
    if(check == 0)
        return WinO;
    else if(check == 3)
        return WinX;
    check = 0;

    check = board[0][2] + board[1][1] + board[2][0];
    if(check == 0)
        return WinO;
    else if(check == 3)
        return WinX;
    check = 0;


    return Continue;
}



void TicTacToe::Debug()
{
    //cout << &board[0][0] << endl;
    for(int i=0;i<3;++i)
    {
        for(int j=0;j<3;++j)
            cout << board[i][j];
        cout << endl;
    }
}

Вот файл драйвера, который я использую для тестирования:

#include "TicTacToe.h"
#include <iostream>
#include <cassert>

using namespace std;

int main()
{
    int row, col;
    bool valid;
    enum Status{WinX, WinO, Continue, Draw};
    TicTacToe * T;
    T = new TicTacToe;
    assert(T != 0);

    cout << "There are 2 players. P1 is x P2 is o" << endl;

    do
    {
        T->PrintBoard();

        valid = false;
        while(valid == false)
        {
            cout << "\nP1 choose a cell" ;
            cin >> row >> col;

            if(T->ValidMove(row, col) == true)
            {
                T->PlayerMove(1, row, col);
                valid = true;
            }
            else
            {
                cout << "Not a valid choice" << endl;
                valid = false;  
            }

        }

        T->PrintBoard();
        cout << endl;

        T->GameStatus();  //<<<<<this is the pain in my butt

        T->PrintBoard();

        valid = false;
        while(valid == false)
        {
            cout << "\nP2 choose a cell" ;
            cin >> row >> col;

            if(T->ValidMove(row, col) == true)
            {
                T->PlayerMove(2, row, col);
                valid = true;
            }
            else
            {
                cout << "Not a valid choice" << endl;
                valid = false;  
            }
        }   
    }
    while(/*T->GameStatus() == Continue*/ 1==1);
                  //the call to GameStatus was commented out of the
                  //while statement for testing


    return 0;

    }

Я знаю код внутри функции GameStatus далеко не красиво, но массив испорчен до того, как любая из этих строк будет обработана.

Я оставил все остальные функции, чтобы показать, что они работают правильно и без проблем.

Заранее благодарим за любую помощь, которую вы можете оказать.

0
задан bvallerand 20 December 2011 в 11:35
поделиться