>source

다음과 같은 오류가 발생합니다.

game.cpp:19:35: error: ‘Player Game::p1’ is private within this context
   19 |  Point playerMove = tictactoeGame.p1.makeMove();
      |                                   ^~
In file included from game.cpp:1:
game.hpp:12:10: note: declared private here
   12 |   Player p1;

다른 변수와 동일한 정확한 상황의 3 개의 오류가 뒤 따릅니다. 이 멤버들은 Game 개체의 일부이므로 액세스 할 수 있다고 생각했습니다.

내가 언급하는 내 수업은 다음과 같습니다.

// game.hpp
#ifndef GAME
#define GAME
// Includes
#include "player.hpp"
#include "board.hpp"
  
class Game
{ 
    private:
        Board gameboard;
        Player p1;
        Player p2;
    public:
        Game(Board& gb, Player& p1, Player& p2);
        bool checkWinner(); // Determine if their is a winner or tie, or if the game is still going.
        void announceResults(int winner); // Announce the winner and end the game.
        bool checkMoveValidity(const Point& sector); // Check if the players move is a valid move.
};
  
#endif
//game.cpp
#include "game.hpp"
Game::Game(Board& gb, Player& p1, Player& p2) : gameboard{gb},p1{p1},p2{p2} {}
// Some functions that were implemented
// Main to test out some functions
int main()
{
    Board tictactoeBoard;
    Player x('x',"Caleb");
    Player o('o',"Caleb2");
    Game tictactoeGame(tictactoeBoard, x, o); 
    Point playerMove = tictactoeGame.p1.makeMove(); ///// Error here
    while(true)
    {
        if(tictactoeGame.checkMoveValidity(playerMove))
        {
            tictactoeGame.gameboard.placePiece(playerMove,tictactoeGame.p1); ///// Error here
            break;
        }
        else
        {
            std::cout << "Invalid move. Please enter a valid move.";
            playerMove = tictactoeGame.p1.makeMove(); ///// Error here
        }
    }
}

또한 다음은에 정의 된 멤버입니다. player.hppboard.hpp


//player.hpp
class Player
{
    private:
        char symbol;
        std::string name;
    public:
        //////
}
//board.hpp
class Board
{
    private:
        std::array<std::array<char,3>,3> board;
    public:
        int rows;
        int cols;
}

이러한 개체에도 개인 속성이 있지만 게임 클래스 내에서 액세스 할 수 있다고 생각했습니다.

내가 만들어야하나요 Game 이 두 클래스의 친구입니까, 아니면 캡슐화가 중단됩니까?

  • 답변 # 1

    댓글 작성자가 지적했듯이 오류를 일으키는 코드 줄은 main 독립형 함수로서 클래스의 개인 변수에 액세스 할 수 없습니다. 클래스의 메서드 만 전용 변수에 액세스 할 수 있습니다.

관련 자료

  • 이전 c# - unity - keypress로 한 게임 오브젝트를 차례로 켭니다
  • 다음 zig - 문자열 배열에 중위 상수가 필요한 이유는 무엇입니까?