2016-06-14 1 views
6

저는 C++을 배우고 Tic Tac Toe의 작은 게임을 만들려고합니다. 그러나 나는 비표준 문법 인 C3867을 계속 사용하고있다. '&'을 사용하여 기억할 포인터를 만듭니다. 여기Visual Studio 2015 "비표준 구문; '&'를 사용하여 멤버에 대한 포인터를 만듭니다.

#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; 
}; 

그리고 내 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; 
} 

이 내 TicTacToe.h입니다. 이 오류를 어떻게 수정합니까?

+1

[mcve]를 생성하십시오. 최소한의 강조. – Barry

+1

문제를 일으키는 라인에 플래그를 지정하여 우리의 삶을 좀 더 쉽게 만들어야합니다! – Sean

+1

당신이 'Board.player1Move'라고 말하면, 그것을 함수로 부르면됩니다. 또한 전달하지 않는 매개 변수 (문자열)를 사용합니다. – Sean

답변

3

문제는 (이 코드에서 두 번 표시) 다음을 포함하는 라인입니다 :

Board.player1Move; 

플레이어 하나의 움직임이 입력으로 표준 : : 문자열 매개 변수를 수신하는 기능입니다. 그것을 호출하기 위해서는 std :: string 객체를 만들어 함수의 인수로 전달해야합니다.

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

또한, 통지 player2Turn 대신 Board.player1Move의 Board.player2Move를 호출해야 : 당신이 문자열이 입력으로 주어하려는 경우 다음 구문을 사용할 수 있습니다.

14

문제가 수정 된 내용은 이미 answer by drorco에 있습니다. 오류 메시지를 설명하려고합니다.

멤버 함수가 아닌 경우 함수 호출 구문을 사용하지 않고 식에서 함수 이름을 사용할 수 있습니다.

void foo() 
{ 
} 

foo; // Evaluates to a function pointer. 

그러나 멤버 함수가있는 경우 함수 호출 구문이없는 표현식에서 멤버 함수 이름을 사용하면 올바르지 않습니다.

struct Bar 
{ 
    void baz() {} 
}; 

Bar::baz; // Not valid. 

멤버 함수에 대한 포인터를 얻으려면 & 연산자를 사용해야합니다. 비주얼 스튜디오에서 오류 메시지를 설명

&Bar::baz; // Valid 

: 신속하게 다음과 같이 코드의 try/catch 블록 응용 프로그램에 std::exception를 추가 할 때 나는이를 얻고 있었다

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

:

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

예외 이름의 매개 변수를 &으로 시작하려면 다음과 같이 변경해야합니다.

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