Ich lerne gerade C++ und versuche, ein kleines Tic Tac Toe-Spiel zu erstellen. Aber ich halte auf C3867, Nicht-Standard-Syntax zu erhalten; verwenden '&' einen Zeiger zu erstellen, zu erinnern.
Dies ist meine TicTacToe.h:
#pragma once
#include <iostream>
using namespace std;
class TicTacToe
{
public:
TicTacToe();
string getName1();
string getName2();
void printBoard();
void clearBoard();
void setName1(string player1Name);
void setName2(string player2Name);
void setSign1(string player1Sign);
void setSign2(string player2Sign, string player1Sign);
void playGame(string player1Name, string player2Name,string player1Sign,string player2Sign);
void player1Move(string coordX);
void player1Turn();
void player2Turn();
private:
char Board[3][3];
string _player1Name;
string _player2Name;
string _player1Sign;
string _player2Sign;
string _coordX;
string _coordY;
};
Und hier ist meine TicTacToe.cpp:
#include "TicTacToe.h"
#include <iostream>
#include <string>
TicTacToe::TicTacToe() {}
void TicTacToe::playGame(string player1Name, string player2Name,
string player1Sign, string player2Sign) {
TicTacToe Board;
Board.setName1(player1Name);
Board.setSign1(player1Sign);
Board.setName2(player2Name);
Board.setSign2(player1Sign, player2Sign);
Board.clearBoard();
Board.printBoard();
}
void TicTacToe::printBoard() {
cout << " |1|2|3|\n";
for (int i = 0; i < 3; i++) {
cout << "--------\n";
cout << i + 1 << "|" << Board[i][0] << "|" << Board[i][1] << "|"
<< Board[i][2] << "|" << endl;
}
}
void TicTacToe::clearBoard() {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
Board[i][j] = ' ';
}
}
}
void TicTacToe::setName1(string player1Name) {
cout << "Enter your name, player 1: \n";
cin >> player1Name;
_player1Name = player1Name;
}
void TicTacToe::setName2(string player2Name) {
cout << "Enter your name, player 2: \n";
cin >> player2Name;
_player2Name = player2Name;
}
string TicTacToe::getName1() { return _player1Name; }
string TicTacToe::getName2() { return _player2Name; }
void TicTacToe::setSign1(string player1Sign) {
cout << "What will you sign be?(X/O)\n";
cin >> player1Sign;
if (player1Sign != "X" && player1Sign != "O" && player1Sign != "x" &&
player1Sign != "o") {
cout << "Invalid input, try again.\n";
cin >> player1Sign;
}
_player1Sign = player1Sign;
}
void TicTacToe::setSign2(string player2Sign, string player1Sign) {
cout << "What will you sign be?(X/O)\n";
cin >> player2Sign;
if (player2Sign != "X" && player2Sign != "O" && player2Sign != "x" &&
player2Sign != "o" ||
player2Sign == player1Sign) {
cout << "Invalid input, try again.\n";
cin >> player2Sign;
}
_player2Sign = player2Sign;
}
void TicTacToe::player1Move(string coordX) // ERROR
{
cout << "Enter X: " << endl;
cin >> coordX;
_coordX = coordX;
}
void TicTacToe::player1Turn() {
cout << "Player 1 turn !\n";
TicTacToe Board;
Board.player1Move;
}
void TicTacToe::player2Turn() {
cout << "Player 2 turn !\n";
TicTacToe Board;
Board.player1Move;
}
Ich habe alles versucht, was in anderen Fragen über diesen Fehler, aber sie didn't funktionieren. Wie kann man diesen Fehler beheben?
Die Lösung für Ihr Problem finden Sie bereits in der Antwort von drorco. Ich werde versuchen, die Fehlermeldung zu erklären.
Wenn Sie eine Nicht-Mitglieder-Funktion haben, können Sie den Funktionsnamen in einem Ausdruck verwenden, ohne die Syntax für den Funktionsaufruf zu verwenden.
void foo()
{
}
foo; // Evaluates to a function pointer.
Wenn es sich jedoch um eine Mitgliedsfunktion handelt, ist die Verwendung des Namens der Mitgliedsfunktion in einem Ausdruck ohne die Funktionsaufrufsyntax nicht zulässig.
struct Bar
{
void baz() {}
};
Bar::baz; // Not valid.
Um einen Zeiger auf eine Mitgliedsfunktion zu erhalten, müssen Sie den Operator &
verwenden.
&Bar::baz; // Valid
Das erklärt die Fehlermeldung von Visual Studio:
"non-standard syntax; use '&' to create a pointer to member"
Das Problem liegt in den Zeilen, die Folgendes enthalten (es erscheint zweimal in Ihrem Code):
Board.player1Move;
Player one move ist eine Funktion, die einen std::string Parameter als Eingabe erhält. Um die Funktion aufzurufen, müssen Sie ein std::string-Objekt erstellen und es als Argument an die Funktion übergeben. Sie können die folgende Syntax verwenden, wenn die Zeichenkette als Eingabe übergeben werden soll:
std::string move;
cin >> move;
Board.player1Move(move);
Beachten Sie auch, dass player2Turn Board.player2Move anstelle von Board.player1Move aufrufen sollte.
Ich bekam dies, wenn ich schnell std::exception
zu einer App für try/catch
Codeblöcke hinzufügte, wie hier:
try{
//code block
}catch(std::exception e){printf("ERROR: %s", e.what()); return -1;}
Ich musste nur den Parameter für den Namen der Ausnahme so ändern, dass er mit "&" beginnt, etwa so:
try{
//code block
}catch(std::exception &e){printf("ERROR: %s", e.what()); return -1;}