2014-03-25 3 views
1

클래스 상속을 사용하여 3D Tic Tac Toe 게임하기 컴파일러 오류는 다음과 같습니다.클래스를 public으로 정의하면 클래스가 private이됩니다.

라인 :

43 [오류] '무효 CPUClass :: CPU가() 내 코드를 보면

(190)이 컨텍스트 내에서 [오류]

개인, 나는 명확하게 정의한를 공개로 cpu(). 어떤 생각을 내가 간과하고있는거야?

#include <iostream> 
#include <time.h> //seeding random 
#include <windows.h> 

using namespace std; 


class TTT { 
     public: 
      void setup(); 
      void display(); 
      void cpu(); 
      void player(); 
      void check(int); 

     protected: 
       int cp; //comp points 
       int pp; //player points 
       char board[9]; //board 
       char board2[9]; 
       char board3[9]; 
       char xo[2]; 
       int rn; //random who goes first 
       int won;//checks for win or stalemate 
       int turn;//keeps track of current player 
       int rc;//random comp move 
       int full;//see if board is full 
       int b1f; 
       int b2f; 
       int b3f; 


}; 

class CPUClass : public TTT{ 


     void cpu(); 

     }; 

int main(int argc, char *argv[]) 
{ 

    TTT ttt; 

    cout << "Newfangled 3D TicTacToe!" << endl; 
    cout << "~~play as though all three boards are stacked as a cube. Same rules apply.~~" << endl; 

    ttt.setup(); 


} 

void TTT::setup(){ //sets up gamespace 

    won = 0; //game not won 
    full = 0; //board is full at 9 
    cp = 0; 
    pp =0; 
    b1f = 0; 
    b2f = 0; 
    b3f=0; 

//the three boards: 
    board[0] = '1'; 
    board[1] = '2'; 
    board[2] = '3'; 
    board[3] = '4'; 
    board[4] = '5'; 
    board[5] = '6'; 
    board[6] = '7'; 
    board[7] = '8'; 
    board[8] = '9'; 

    board2[0] = '1'; 
    board2[1] = '2'; 
    board2[2] = '3'; 
    board2[3] = '4'; 
    board2[4] = '5'; 
    board2[5] = '6'; 
    board2[6] = '7'; 
    board2[7] = '8'; 
    board2[8] = '9'; 

    board3[0] = '1'; 
    board3[1] = '2'; 
    board3[2] = '3'; 
    board3[3] = '4'; 
    board3[4] = '5'; 
    board3[5] = '6'; 
    board3[6] = '7'; 
    board3[7] = '8'; 
    board3[8] = '9'; 

    srand(time(NULL)); 
    rn = (rand() %2); 

    if (rn == 0){ 
      turn = 0; // comp goes first 
      xo[0] = 'x'; //comp = x 
      xo[1] = 'o'; //human = o 
      cout << "\nYou are 'O'" << endl; 
      }else{ 
       turn = 1; //player goes first 
       xo[0] = 'o'; //comp = o 
       xo[1] = 'x'; // human = x 
       cout << "\nYou are 'X'" << endl; 
       } 

    display(); //send this info to display function 
    } 

void TTT::display(){/******you left off revising right here at 2:10******/ 

    cout << "" << endl; 
    for (int i = 0; i < 9; i++) 
    { 


     if ((i+1) % 3 == 0) 
     { 
      cout << board[i] << endl; 
     } 
     else 
     { 

      cout << board[i] << " | "; 
     } 
    } 

    cout << "" << endl; 
    cout << "\t"; 
    for (int i = 0; i < 9; i++) 
     { 


     if ((i+1) % 3 == 0) 
     { 

      cout << board2[i] << endl; 
      cout << "\t"; 
     } 
     else 
     { 

      cout << board2[i] << " | "; 
     } 


    } 

    cout << "" << endl; 
    cout << "\t\t"; 
    for (int i = 0; i < 9; i++) 
    { 


     if ((i+1) % 3 == 0) 
     { 

      cout << board3[i] << endl; 
      cout << "\t\t"; 
     } 
     else 
     { 

      cout << board3[i] << " | "; 
     } 


    } 
    cout << "" << endl; 

    CPUClass cc; 

    if (full == 27){ //if board is full 
    check(won); //check if game has been won or tiedtied 
     } 
    else{ 

     if (turn%2 == 0){ 
      player(); 
      }else{ 
       cc.cpu(); 
      } 

     } 

    } 

void TTT::player(){ 

    int w; 
    int p; 
    while (won != 1) //if no one has won 
    { 

    cout << "Make your move: Choose a layer [top=1 middle=2 bottom=3]" << endl; 
    cin>> p; 

    if (p == 1){ 

      cout << "Make your move: Choose a space" << endl; 
      cin>>w; 

      if ((board[w-1] == 'x') || (board[w-1] == 'o')){ //checks if spot is open 

      cout << "\nSpace occupied, Invalid move\n"; 
      player(); 

     }else{ 
       board[w-1] = xo[1];//draws current players move 
       turn ++; 
       full ++; 
       b1f++; 
       display(); //go to display 
       } 

      } 

     else if (p == 2){ 

      cout << "Make your move: Choose a space" << endl; 
      cin>>w; 

      if ((board2[w-1] == 'x') || (board2[w-1] == 'o')){ //checks if spot is open 

      cout << "\nSpace occupied, Invalid move\n"; 
      player(); 

     }else{ 
       board2[w-1] = xo[1]; 
       turn ++; 
       full ++; 
       b2f++; 
       display(); 
       } 

      } 

    else if (p == 3){ 

      cout << "Make your move: Choose a space" << endl; 
      cin>>w; 

      if ((board3[w-1] == 'x') || (board3[w-1] == 'o')){ //checks if spot is open 

      cout << "\nSpace occupied, Invalid move\n"; 
      player(); 

     }else{ 
       board3[w-1] = xo[1]; 
       turn ++; 
       full ++; 
       b3f; 
       display(); 
       } 

      } 
      else{ 
       cout <<"Please select one of the options!\n\n" ; 
       player(); 
       } 

    } 

    } 
void TTT::cpu(){ 


    srand(time(NULL)); //seeds with clock 
    rc = (rand() %9); 
    int bc; 

    if (b1f == 9){ //if a board is filled go one of the opthers 
      bc = 1+(rand() %2); 
     } 
     else if (b3f == 9){ 
      bc = (rand() %2); 
      } 
     else if (b2f == 9){ 
      bc = (rand() %2); 
      if (bc == 1){ 
        bc = 2; 
        } 
      } 
     else { 
      bc = (rand() %3); //randomly pick one if none are full 
      } 

    if (bc == 0){ 

    if ((board[rc] == 'x') || (board[rc] == 'o')){ 

     cpu(); //loops and finds a new spot 

     }else{ 
      turn++; 
      full ++; 
      b1f++; 
      board[rc] = xo[0]; 
      display(); 
     } 

    } 

    else if (bc == 1){ 

      if ((board2[rc] == 'x') || (board2[rc] == 'o')){ 

     cpu(); //loops and finds a new spot 

      }else{ 
      turn++; 
      full ++; 
      b1f++; 
      board[rc] = xo[0]; 
      display(); 
     } 

    } 

      else if (bc == 2){ 

       if ((board3[rc] == 'x') || (board3[rc] == 'o')){ 

     cpu(); //loops and finds a new spot 

     }else{ 
      turn++; 
      full ++; 
      b1f++; 
      board[rc] = xo[0]; 
      display(); 
     } 
    } 
       } 

void TTT::check(int wo)// check wins 
{ 
    //horizontal win 
     if ((board[0] == 'x') && (board[1] == 'x') && (board[2] == 'x')){ 

        if (rn == 0){ 
          cp++; 
          }else{ 
           pp++; 
           } 

        } 


     if ((board[6] == 'x') && (board2[4] == 'x') && (board3[2] == 'x')){ 


      if (rn == 0){ 
          cp++; 
          }else{ 
           pp++; 
           } 
      } 

       wo =1; 
       cout << "\nGame Over!\n" ; 

       cout << "\nScore: Player - "<<pp<<" Computer - "<<cp<<"\n" ; 

       if (pp == cp){ //if points are = 
        cout << "STALEMATE\n" ; 
        } 
       else if (pp > cp){ 
        cout << "YOU WIN\n" ; 
        } 
       else if (pp < cp){ 
        cout << "The computer wins\n" ; 
        } 

       int c; 
      cout<<"\nPlay again? [1] for yes anything else to exit\n" ; 
      cin >> c; 

      if (c == 1){ //if user enters 1, reset the game 
       setup(); 
       } 
      else{ 
      exit(0); 

       } 
    } 
+1

Note 함수'CPUClass :: cpu()'*는'TTT :: cpu()'함수를 숨 깁니다. 이 두 기능은 전적으로 관련이 없습니다. – aschepler

답변

2

기본적으로 클래스 액세스는 비공개입니다. 당신이 CPUClass 객체를 통해 CPUClass::cpu() 함수를 호출하려는 경우, 당신은 할 필요가 cpu() 공개 : 당신이 원하는 경우 다른

class CPUClass : public TTT{ 
public: 

    void cpu(); 

    }; 
0

방법은 기본적으로 자신이 비공개 다른 멤버 함수에서 클래스의 멤버 함수를 사용하면 다음과 같은 함수를 호출 할 수 있습니다.

TTT::cpu(); //replace for any calls to cc.cpu(); 

분명하지 않습니다. f CPUClass가 어떤 용도로 사용되는지 코드에 기록하십시오. 현재 수행중인 작업은 기본 클래스에서 모든 것을 상속받는 새 클래스를 만드는 것입니다. 그런 다음 기본 클래스의 cpu() 메소드를 새로운 빈 메소드로 대체하고 액세스를 private로 변경합니다.

+0

알겠습니다. 그건 내 오류를 제거하지 않습니다하지만 새로운 생성 'CPUClass :: CPU()' 이 [오류] 이드 1 종료 상태 당신은 CPUClass에서 CPU의 정의()를 부여하지 않은 – user3461666

+0

을 반환에 정의되지 않은 참조를, 선언 만. – user3288829

0

를 지정하지 않는 한 클래스에서

class CPUClass : public TTT{ 
public:   //<<----- make below functions public 
     void cpu(); 
};