错误地说定义为public的类是private

error saying class defined as public is private

本文关键字:private public 定义 错误      更新时间:2023-10-16

使用类继承制作3D井字游戏。编译错误如下。

:

43[错误]'void CPUClass::cpu()'是private

190 [Error]在这个上下文中

看看我的代码,我已经明确地将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 << "tt";
     for (int i = 0; i < 9; i++)
    {

        if ( (i+1) % 3 == 0 ) 
        {
            cout << board3[i] << endl; 
            cout << "tt";
        }
        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 moven";
            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 moven";
            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 moven";
            player();
        }else{
              board3[w-1] = xo[1];
              turn ++;
              full ++;
              b3f;
              display(); 
              }
           } 
           else{
                cout <<"Please select one of the options!nn" ; 
                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 << "STALEMATEn" ;
                     }
              else if (pp > cp){
                   cout << "YOU WINn" ;
                   }
              else if (pp < cp){
                   cout << "The computer winsn" ;
                   }
              int c;
           cout<<"nPlay again? [1] for yes anything else to exitn" ;
           cin >> c;
           if (c == 1){ //if user enters 1, reset the game
                 setup();
                 }
           else{
           exit(0);
              }
     }

默认情况下,类访问为private。如果你想通过CPUClass对象调用CPUClass::cpu()函数,你需要将cpu()设为public:

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

类中的方法在默认情况下本身是私有的,除非您另行指定

class CPUClass : public TTT{
public:
  void cpu();
  };

如果您想在另一个成员函数中使用类的成员函数,您可以这样调用该函数:

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

从你的代码中不清楚cpucclass的用途。你目前正在做的是创建一个新类,它继承了基类的所有内容。然后用一个新的空方法覆盖基类的cpu()方法,并将其访问权限更改为private。