2017-12-21 3 views
0

Ich möchte auf eine öffentliche Variable zugreifen, die ich am Anfang meiner Klasse von einer ihrer Mitgliedsfunktionen deklariert habe. Aber es sagt, es ist außerhalb des Geltungsbereichs.Wie kann auf öffentliche Variablen innerhalb der Member-Funktionen ihrer eigenen Klasse zugegriffen werden? (C++)

Goban :: Goban (Konstruktor) funktioniert gut. Es greift erfolgreich auf die Werte von "board" und "isWhiteToPlay" zu und ändert sie wie beabsichtigt.

Der Code von printBoard funktionierte, als er im Programm war, das diese Klasse aufruft, aber jetzt, da ich ihn hierher verschoben habe, wurden Versuche zum Kompilieren mit '' board 'in diesem Bereich nicht deklariert ". Weder board noch isWhiteToPlay entkommen in playMove dem gleichen Schicksal.

Was mache ich hier falsch? Es ist eine öffentliche Variable, aber es sollte nicht einmal sein müssen, da ich noch in der Klasse bin, oder? Gibt es eine einfache Möglichkeit, Gobans Variablen aus Gobans Funktionen heraus aufzurufen und zu ändern? Ich würde mich nicht darauf freuen, Board als Zeiger behandeln zu müssen, um es an die Funktion zu übergeben und es dann zurückzugeben. Ich denke, ich könnte es schaffen, aber ich kann mir nicht vorstellen, dass es keinen wesentlich eleganteren Weg gibt.

class Goban 
    { 
    public: 
     int board[9][9]; // y,x -1 = W +1 = B 
     int captures[2]; 
     bool isWhiteToPlay; // 0 for Black's turn, 1 for White's turn 

    Goban(); 
    void printBoard(); // Prints the board to the terminal wherefrom the program is called. 
    void playMove(int x, int y); // Makes a move for the turn player at the coordinate (x,y). Right now I'm just trying to get it to change the value of the proper coordinate of "board" and not caring if the move is legal. 
}; 

Goban::Goban() // Just initializing everything to zero here for now. Interesting to note that there are no compiling errors in this constructor. But later it complains when I use board and isWhiteToPlay elsewhere. The only difference I can see is that here they're in for loops, and there they're in if clauses. Not sure why that would make a difference, nor how to work around it. 
{ 
    captures[0] = 0; 
    captures[1] = 0; 

    for (int j = 0; j <= 8; j++) 
    { 
    for (int i = 0; i <=8; i++) 
    { 
     board[j][i] = 0; 
    } 
    } 

    isWhiteToPlay = 0; 
} 

void printBoard() // This code worked correctly when it was in the program, but the problem started when I moved it here to the class. 
{ 
    for (int j = 0; j <= 8; j++) 
    { 
    for (int i = 0; i <= 8; i++) 
    { 
     if (board[j][i] == -1) 
     { std::cout << " O"; } 
     else if (board[j][i] == 1) 
     { std::cout << " X"; } 
     else 
     { std::cout << " ."; } 
    } 
    } 
} 

void playMove(int x, int y) // Same errors as above; solution is probably the same. 
{ 
    if (isWhiteToPlay == 0) 
    { 
    board[y][x] = -1; 
    isWhiteToPlay = 1; 
    } 
    else 
    { 
    board[y][x] = 1; 
    isWhiteToPlay = 0; 
    } 
} 

Ich vermute, jemand hat wahrscheinlich schon diese Frage gestellt, aber ich glaube, ich bin einfach nicht mit den richtigen Suchbegriffen kommen, die wahrscheinlich ein Anzeichen dafür ist, dass ich nicht ganz verstehen, was ich tue falsch hier. Wenn jemand das Problem versteht, habe ich genug, um die richtigen Suchbegriffe zu kennen, wäre ein Link zu dem entsprechenden Stack-Overflow-Thread willkommen. Natürlich würde ich mich hier nicht über die Antworten beschweren, aber das Rad und all das nicht neu erfinden müssen.

Antwort

2

Sie wollen Goban::printBoard und Goban::playMove haben. Wie es ist, deklarieren Sie einfach freie Funktionen.

z.B.

void Goban::printBoard() 
{ 
} 

Genau wie Sie für Ihren Konstruktor:

Goban::Goban() 
{ 
} 

Ich gehe davon aus, wenn Sie sagen

Printplatte Code gearbeitet, als es in dem Programm, das diese Klasse ruft

Sie meinen, dass es früher funktionierte, wenn Sie den Code in der Klasse dekl hatten Sie haben sie jetzt in eine separate Definition verschoben.

+0

Ich denke, das ist es. Das war noch einfacher als ich erwartet hatte. Vielen Dank. EDIT: Ja. Habe das geändert und alle Fehler sind poof geworden. Danke nochmal. – Joshua

Verwandte Themen