2016-06-14 4 views
6

Ich lerne C++ und versuche ein kleines Spiel von Tic Tac Toe zu machen. Aber ich bekomme weiterhin C3867, Nicht-Standard-Syntax; Verwenden Sie '&', um einen Zeiger zum Speichern zu erstellen.Visual Studio 2015 "Nicht-Standard-Syntax; benutz '' und 'um einen Zeiger auf ein Mitglied zu erstellen "

Das ist mein 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 mein 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 alles in anderen Fragen zu diesem Fehler versucht, aber sie funktionierte nicht. Wie behebst du diesen Fehler?

+1

Bitte erstellen Sie eine [mcve]. Schwerpunkt auf minimal. – Barry

+1

Sie müssen die Linie markieren, die das Problem verursacht, um unser Leben ein bisschen einfacher zu machen! – Sean

+1

Sie sagen 'Board.player1Move', wenn Sie es als eine Funktion nennen möchten. Außerdem benötigt es einen Parameter (eine Zeichenfolge), den Sie nicht übergeben. – Sean

Antwort

3

Das Problem ist mit den Linien, die die folgenden enthalten (es zweimal im Code angezeigt):

Board.player1Move; 

Spieler einen Zug eine Funktion, die erhalten ist ein std :: string Parameter als eine Eingabe. Um es aufzurufen, müssen Sie ein std :: string-Objekt erstellen und als Argument für die Funktion übergeben. Sie können die folgende Syntax verwenden, wenn Sie die Zeichenfolge wollen als eine Eingabe gegeben werden:

std::string move; 
cin >> move; 
Board.player1Move(move); 

Beachten Sie auch, dass player2Turn Board.player2Move statt Board.player1Move nennen sollte.

14

Die Lösung für Ihr Problem ist bereits in der answer by drorco zur Verfügung gestellt. Ich werde versuchen, die Fehlermeldung zu erklären.

Wenn Sie eine Nichtmitgliedsfunktion haben, können Sie den Funktionsnamen in einem Ausdruck verwenden, ohne die Funktionsaufrufsyntax zu verwenden.

void foo() 
{ 
} 

foo; // Evaluates to a function pointer. 

Wenn Sie jedoch eine Member-Funktion haben, die Funktionsnamen ohne Funktionsaufruf Syntax in einem Ausdruck Element verwendet, ist ungültig.

struct Bar 
{ 
    void baz() {} 
}; 

Bar::baz; // Not valid. 

Um einen Zeiger auf eine Elementfunktion zu erhalten, müssen Sie den & Operator verwenden.

&Bar::baz; // Valid 

dass die Fehlermeldung von Visual Studio erklärt:

"non-standard syntax; use '&' to create a pointer to member" 
1

ich dies immer, wenn schnell std::exception zu einer App für try/catch Code-Blöcke hinzufügen, wie folgt aus:

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 ändern, um mit & zu beginnen, so:

try{ 
//code block 
}catch(std::exception &e){printf("ERROR: %s", e.what()); return -1;} 
Verwandte Themen