I have had a similar issue with quite a few projects I have worked on involving classes containing arrays. I have a class that is supposed to handle a 2 dimensional matrix representing a TicTacToe game. There is an enumeration in the class for the status of the current game and one member function that has an enumeration return type. I cant seem to figure out why I can create the class set values in the matrix and as soon as I call the member function with the enumerated return type the whole array is reinitialized to 0. I think it has something to do with the constructor being called again or something along those lines but I have not been able to find anything after searching for the past few hours. Any help would be greatly appreciated.
Here is my header file containing the class information:
#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 
Here is the code for CPP file with the member function definitions:
#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 ©)
{
    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;
    }
}
Here is the driver file I am using to test:
#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;
    }
I know the code inside of the GameStatus function is far from pretty but the array is messed up before any of those lines are processed.
I left all of the other functions just to show that they work properly without issue.
Thanks in advance for any help you may be able to give.
 
     
     
     
     
     
    