Visual Studio 2015 "sintaksis non-standar; gunakan '&' untuk membuat pointer ke anggota"

Saya sedang belajar C++ dan mencoba membuat permainan kecil Tic Tac Toe. Tapi saya terus mendapatkan C3867, sintaks yang tidak standar; gunakan '&' untuk membuat pointer untuk diingat.

Ini adalah TicTacToe.h saya:

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

Dan ini adalah TicTacToe.cpp saya:

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

Saya telah mencoba segala sesuatu di pertanyaan lain tentang kesalahan ini tetapi tidak berhasil. Bagaimana Anda memperbaiki kesalahan ini?

Perbaikan untuk masalah Anda sudah disediakan di jawaban oleh drorco. Saya akan mencoba menjelaskan pesan kesalahan tersebut.

Ketika anda memiliki fungsi non-anggota, anda bisa menggunakan nama fungsi dalam ekspresi tanpa menggunakan sintaks pemanggilan fungsi.

void foo()
{
}

foo; // Evaluates to a function pointer.

Namun, bila Anda memiliki fungsi anggota, menggunakan nama fungsi anggota dalam ekspresi tanpa sintaks pemanggilan fungsi tidak valid.

struct Bar
{
   void baz() {}
};

Bar::baz;  // Not valid.

Untuk mendapatkan pointer ke fungsi anggota, Anda perlu menggunakan operator &.

&Bar::baz;   // Valid

Itu menjelaskan pesan kesalahan dari Visual Studio:

"non-standard syntax; use '&' to create a pointer to member"
Komentar (2)
Larutan

Masalahnya adalah pada baris yang berisi berikut ini (muncul dua kali dalam kode Anda):

Board.player1Move;

Player one move adalah sebuah fungsi yang menerima parameter std::string sebagai input. Untuk memanggilnya, Anda harus membuat objek std::string dan meneruskannya sebagai argumen untuk fungsi tersebut. Anda dapat menggunakan sintaks berikut jika Anda ingin string diberikan sebagai input:

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

Juga, perhatikan bahwa player2Turn harus memanggil Board.player2Move, bukan Board.player1Move.

Komentar (0)

Saya mendapatkan ini ketika dengan cepat menambahkan std::exception ke aplikasi untuk blok kode try/catch, seperti ini:

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

Saya hanya perlu mengubah parameter untuk nama pengecualian untuk memulai dengan &, seperti ini:

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