2016-07-14 49 views
0

我試圖從Eclipse移到視覺工作室,因爲我已經被告知它對新手來說更容易中間,我同意我的最初印象。我正在嘗試重建類的經典TicTacToe生成只是作爲測試文件,以獲得IDE的感覺,我在Visual Studio中收到28個錯誤和1個警告,相比之下沒有錯誤和1個警告在Eclipse中...代碼是一模一樣。我完全困惑。不同的IDE產生0錯誤與28錯誤

要明確它在Eclipse中編譯和運行,同時在Visual Studio中收到28個錯誤。

這是怎麼發生的?

代碼下面

錯誤列表

Severity Code Description Project File Line Suppression State 
Error C2065 'moveCounter': undeclared identifier TicTacToeWithClasses c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp 167 
Error C2653 'TicTacToe': is not a class or namespace name TicTacToeWithClasses c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp 10 
Error C4430 missing type specifier - int assumed. Note: C++ does not support default-int TicTacToeWithClasses c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp 11 
Error C2550 'TicTacToe': constructor initializer lists are only allowed on constructor definitions TicTacToeWithClasses c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp 13 
Warning C4508 'TicTacToe': function should return a value; 'void' return type assumed TicTacToeWithClasses c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp 14 
Error C2653 'TicTacToe': is not a class or namespace name TicTacToeWithClasses c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp 16 
Error C2065 'squareArray': undeclared identifier TicTacToeWithClasses c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp 24 
Error C2065 'squareArray': undeclared identifier TicTacToeWithClasses c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp 29 
Error C2065 'squareArray': undeclared identifier TicTacToeWithClasses c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp 34 
Error C2653 'TicTacToe': is not a class or namespace name TicTacToeWithClasses c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp 38 
Error C3861 'getPlayerMove': identifier not found TicTacToeWithClasses c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp 48 
Error C3861 'checkForWin': identifier not found TicTacToeWithClasses c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp 50 
Error C3861 'checkForTie': identifier not found TicTacToeWithClasses c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp 56 
Error C3861 'togglePlayer': identifier not found TicTacToeWithClasses c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp 63 
Error C2653 'TicTacToe': is not a class or namespace name TicTacToeWithClasses c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp 70 
Error C2065 'squareArray': undeclared identifier TicTacToeWithClasses c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp 98 
Error C2065 'squareArray': undeclared identifier TicTacToeWithClasses c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp 100 
Error C2065 'moveCounter': undeclared identifier TicTacToeWithClasses c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp 105 
Error C2653 'TicTacToe': is not a class or namespace name TicTacToeWithClasses c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp 116 
Error C2653 'TicTacToe': is not a class or namespace name TicTacToeWithClasses c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp 124 
Error C2065 'moveCounter': undeclared identifier TicTacToeWithClasses c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp 128 
Error C3861 'checkLineForWin': identifier not found TicTacToeWithClasses c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp 138 
Error C3861 'checkLineForWin': identifier not found TicTacToeWithClasses c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp 146 
Error C3861 'checkLineForWin': identifier not found TicTacToeWithClasses c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp 151 
Error C2653 'TicTacToe': is not a class or namespace name TicTacToeWithClasses c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp 157 
Error C2065 'squareArray': undeclared identifier TicTacToeWithClasses c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp 159 
Error C2065 'squareArray': undeclared identifier TicTacToeWithClasses c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp 160 
Error C2065 'squareArray': undeclared identifier TicTacToeWithClasses c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp 161 
Error C2653 'TicTacToe': is not a class or namespace name TicTacToeWithClasses c:\users\tamend\documents\visual studio 2015\projects\tictactoewithclasses\tictactoewithclasses\tictactoeclassimp.cpp 164 

// TicTacToeWithClasses.cpp : Defines the entry point for the console application. 
// 

#include "stdafx.h" 
#include <iostream> 
#include "TicTacToe.h" 

bool getUserWantToPlay(); 

int main() 
{ 

    while (getUserWantToPlay()) 
    { 

     TicTacToe game; 
     game.playGame(); 

    } 

    return(0); 
} 

bool getUserWantToPlay() 
{ 

    //Assumes no play until response received 
    char response; 
    bool invalidResponse = true; 
    bool play = false; 

    while (invalidResponse) 
    { 

     std::cout << "Would you like to play a new game of TicTacToe? (y/n) " << std::endl; 
     std::cin >> response; 

     if (response == 'y') 
     { 
      invalidResponse = false; 
      play = true; 
     } 
     else if (response == 'n') 
     { 

      std::cout << "No Problem!" << std::endl; 
      invalidResponse = false; 
     } 
     else 
     { 
      std::cout << "Please input a proper response (y/n) " << std::endl; 
     } 
    } 

    return play; 
} 

部首

#ifndef TICTACTOE_H_ 
#define TICTACTOE_H_ 


class TicTacToe 
{ 

    public: 
     TicTacToe(); 
     void playGame(); 

    private: 
     void drawBoard(); 
     void getPlayerMove(char player); 
     char togglePlayer(char player); 

     bool checkForWin(char player); 
     bool checkLineForWin(int square1, int square2, int square3, char player); 
     bool checkForTie(); 

     char squareArray[9]; 
     int moveCounter; 

}; 

#endif 

類實現

//TicTacToe class implementation 

#include "TicTacToe.h" 
#include "stdafx.h" 
#include <iostream> 

static const int MinMovesNeededToWin = 5; 
static const int MaxMovesInGame = 9; 

TicTacToe::TicTacToe() 
: squareArray{ '1','2','3','4','5','6','7','8','9' }, 
moveCounter(0) 
{ 
} 

void TicTacToe::drawBoard() 
{ 

    //Draws the game board with updated characters for each player 

    std::cout << "Player 1 (X) - Player 2 (O)" << std::endl << std::endl << std::endl; 

    std::cout << " |  |" << std::endl; 
    std::cout << " " << squareArray[0] << " | " << squareArray[1] << " | " << squareArray[2] << std::endl; 

    std::cout << "____|_____|____" << std::endl; 
    std::cout << " |  | " << std::endl; 

    std::cout << " " << squareArray[3] << " | " << squareArray[4] << " | " << squareArray[5] << std::endl; 

    std::cout << "____|_____|____" << std::endl; 
    std::cout << " |  | " << std::endl; 

    std::cout << " " << squareArray[6] << " | " << squareArray[7] << " | " << squareArray[8] << std::endl; 

} 

void TicTacToe::playGame() 
{ 

    char player = 'X'; 
    bool gameOver = false; 

    do 
    { 

     drawBoard(); 
     getPlayerMove(player); 

     if (checkForWin(player)) 
     { 

      std::cout << std::endl << "Congratulations player " << player << "! You win!" << std::endl; 
      gameOver = true; 
     } 
     else if (checkForTie()) 
     { 

      std::cout << "Tie! You should play again to settle the duel!" << std::endl; 
      gameOver = true; 

     } 
     player = togglePlayer(player); 

    }while (!gameOver); 

    drawBoard(); 
} 

void TicTacToe::getPlayerMove(char player) 
{ 

    //Gets player move and stores in board array for display through next iteration 

    bool playerMoveFound = false; 
    char playerTurn = '0'; 
    char playerMove = '0'; 

    if (player == 'X') 
    { 
     playerTurn = '1'; 
    } 
    else 
    { 
     playerTurn = '2'; 
    } 

    while (playerMoveFound == false) 
    { 

     std::cout << "Player " << playerTurn << " please make a move" << std::endl; 
     std::cin >> playerMove; 

     for (int counter = 0; counter < 9; counter++) 
     { 

      //If finds the array number makes the change to the iteration...prevents x or o movement 
      if (playerMove == squareArray[counter] && playerMove != 'X' && playerMove != 'O' && playerMove != 'x' && playerMove != 'o') 
      { 
       squareArray[counter] = player; 

       playerMoveFound = true; 

       //Move counter implemented to streamline check for win/check for tie 
       moveCounter++; 
      } 
     } 

     if (playerMoveFound == false) 
     { 
      std::cout << "Invalid player move..." << std::endl; 
     } 
    } 
} 

char TicTacToe::togglePlayer(char player) 
{ 

    player = player == 'X' ? 'O' : 'X'; 

    return(player); 
} 

bool TicTacToe::checkForWin(char player) 
{ 
    bool playerWin = false; 

    if (moveCounter >= MinMovesNeededToWin) 
    { 

     // Only need to check for current player 
     // Only need to check until we have a win 

     // Tests rows for win 
     for (int rowCounter = 0; !playerWin && rowCounter < 8; rowCounter += 3) 
     { 

      playerWin = checkLineForWin(rowCounter, rowCounter + 1, rowCounter + 2, player); 

     } 

     // Tests columns for win 
     for (int columnCounter = 0; !playerWin && columnCounter < 3; columnCounter++) 
     { 

      playerWin = checkLineForWin(columnCounter, columnCounter + 3, columnCounter + 6, player); 

     } 

     // Tests diagnols for win 
     playerWin |= (checkLineForWin(0, 4, 8, player) | checkLineForWin(2, 4, 6, player)); 
    } 

    return(playerWin); 
} 

bool TicTacToe::checkLineForWin(int square1, int square2, int square3, char player) 
{ 
    return squareArray[square1] == player && 
     squareArray[square2] == player && 
     squareArray[square3] == player; 
} 

bool TicTacToe::checkForTie() 
{ 

    return moveCounter == MaxMovesInGame; 

} 
+0

有可能你的類實現文件沒有編譯,因爲'stdafx.h'沒有被包含在第一個;改變包含的順序,以便'stdafx.h'被包含在_before_'TicTacToe.h'中。 – ildjarn

+0

@ildjarn哇......修好了!哈哈謝謝你!請問爲什麼會發生?請張貼作爲答案,我可以給你信貸。到底什麼是stdafx.h?顯然這是一個頭文件,但它有什麼?我在日食中沒有看到。 – StormsEdge

+1

它與預編譯頭文件一起使用。請參閱[stdafx.h:我什麼時候需要它?](http://stackoverflow.com/questions/676385/stdafx-h-when-do-i-need-it) –

回答

2

用Visual C++,當precompiled headers被啓用(它們通常是通過默認,名爲stdafx.h)你的PCH必須包括在每個轉換單元中第一報頭。如果你忘記包含PCH,你會得到一個合理的C1010錯誤告訴你;然而,不幸的是,沒有明智的診斷輸出來告訴你爲什麼當你僅僅以錯誤的順序包含頭文件時失敗。

更改您的訂單類實現TU包括使stdafx.hTicTacToe.h,才能將。有關VC++上下文中預編譯頭文件的更多信息,請參見here

+1

或者,指定[/ FI(名稱強制包含文件)](https://msdn.microsoft.com/en-us/library/8c5ztk84.aspx)編譯器選項。編譯第三方庫代碼時,這是非常有趣的,你不能修改,但仍然希望使用預編譯頭文件。 – IInspectable