C++を学んでいて、Tic Tac Toeの小さなゲームを作ろうとしています。しかし、C3867が何度も出てきます。「非標準の構文;ポインタを作成するのに '&'を使用してください。
これは私の 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;
};
そして、これが私の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;
}
このエラーに関する他の質問にあることは全て試しましたが、うまくいきませんでした。どのようにしてこのエラーを修正しますか?
あなたの問題に対する解決策は、drorcoさんの回答にすでに記載されています。エラーメッセージの説明をしてみます。
メンバーではない関数がある場合、関数呼び出しの構文を使わずに関数名を式の中で使うことができます。
void foo()
{
}
foo; // Evaluates to a function pointer.
しかし、メンバー関数がある場合、関数呼び出し構文を使わずにメンバー関数名を式の中で使用することは有効ではありません。
struct Bar
{
void baz() {}
};
Bar::baz; // Not valid.
メンバ関数へのポインタを取得するには、&
演算子を使用する必要があります。
&Bar::baz; // Valid
これがVisual Studioのエラーメッセージの説明です。
"non-standard syntax; use '&' to create a pointer to member"
問題となるのは、次のような内容の行です(コード中に2回登場します)。
Board.player1Move;
Player one moveは、std::stringパラメータを入力として受け取る関数です。これを呼び出すためには、std::stringオブジェクトを作成し、関数の引数として渡す必要があります。文字列を入力として与えたい場合は、次のような構文が使えます。
std::string move;
cin >> move;
Board.player1Move(move);
また、player2TurnはBoard.player1Moveではなく、Board.player2Moveを呼び出す必要があることに注意してください。
この現象は、アプリに std::exception
を素早く追加して try/catch
ブロックのコードを作成したときに発生しました。
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;}