2016-06-14 9 views
6

Uczę się C++ i staram się zrobić małą grę w Tic Tac Toe. Ale wciąż otrzymuję C3867, niestandardową składnię; użyj "&", aby utworzyć wskaźnik do zapamiętania.Visual Studio 2015 "niestandardowa składnia; użyj "&", aby utworzyć wskaźnik do członka "

To mój 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; 
}; 

I tu jest moje 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; 
} 

Próbowałem wszystkiego w innych pytań dotyczących tego błędu, ale nie działa. Jak naprawiasz ten błąd?

+1

Utwórz [mcve]. Nacisk na minimalny. – Barry

+1

Musisz oznaczać linię powodującą problem, aby nasze życie było łatwiejsze! – Sean

+1

Mówisz 'Board.player1Move', kiedy masz przypuszczać, że nazywasz to funkcją. Ponadto pobiera parametr (ciąg znaków), którego nie przekazujesz. – Sean

Odpowiedz

3

Problem jest z liniami, które zawierają następujące (wydaje się dwa razy w kodzie):

Board.player1Move; 

Odtwarzacz ten pojedynek jest funkcją, która otrzyma parametr std :: string jako wejście. Aby go wywołać, musisz utworzyć obiekt std :: string i przekazać go jako argument dla funkcji. Można użyć następującej składni, jeśli chcesz, łańcuch zostanie podane jako wejście:

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

również zauważyć, że player2Turn powinien zadzwonić Board.player2Move zamiast Board.player1Move.

14

Rozwiązanie problemu jest już dostępne w wersji answer by drorco. Mam zamiar spróbować wyjaśnić komunikat o błędzie.

Gdy masz funkcję bez funkcji, możesz użyć nazwy funkcji w wyrażeniu bez użycia składni wywołania funkcji.

void foo() 
{ 
} 

foo; // Evaluates to a function pointer. 

Jednak w przypadku funkcji składowej użycie nazwy funkcji składowej w wyrażeniu bez składni wywołania funkcji jest niepoprawne.

struct Bar 
{ 
    void baz() {} 
}; 

Bar::baz; // Not valid. 

Aby uzyskać wskaźnik do funkcji składowej, trzeba użyć operatora &.

&Bar::baz; // Valid 

To wyjaśnia komunikat o błędzie z programu Visual Studio:

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

byłem coraz to kiedy szybko dodając std::exception do aplikacji dla try/catch bloków kodu, takich jak to:

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

Właśnie musiałem zmienić parametr nazwy wyjątku na początek &, tak jak:

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