2016-03-03 2 views
1

Я только что начал степень CS, и я совершенно новый для реального программирования, и, следовательно, реализация оказывается сложной. Недавно у меня было задание, которое оставило меня в тупике. Я был в тупике, потому что мне не удалось связать все файлы вместе (2 файла заголовка .hpp и 2 файла реализации .cpp). Назначение пришло и ушло. Мне просто интересно, как бы я связал все файлы вместе, так как я знаю, что когда дело доходит до времени компиляции, файлы Board.hpp и Board.cpp будут скомпилированы в один файл, а TicTacToe.hpp и файлы TicTacToe.cpp будут скомпилированы в один файл. И тогда все два скомпилированных файла будут связаны друг с другом для создания исполняемого файла.Ошибки при компиляции нескольких файлов .hpp и .cpp в C++

Здесь ошибка я получаю, когда я пытаюсь скомпилировать в г ++:

TicTacToe.hpp:1:9: warning: #pragma once in main file 
/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64/crt1.o: In function `_start': 
(.text+0x20): undefined reference to `main' 
collect2: ld returned 1 exit status 

Я понятия не имею, что любое из этого средства.

Я отправлю файлы ниже для просмотра. Я ценю любую помощь, которую вы можете дать. Опять же, я новичок в этом, поэтому, если бы вы могли объяснить вещи, я бы очень признателен.

Board.hpp

#ifndef BOARD_HPP 
#define BOARD_HPP 

#include <iostream> 
#include <string> 


class TTTBoard 
{ 
private: 
char Board[3][3];   //creates array 
int play();     // prototype for play function 
void makeMove();   //prototype for makeMove function 
int turn(int);    //prototype for turn function 
int check(int, int);  //prototypr for check function 
void print(char x[][3]); //prototype for print function 
int gameState(char x[][3]); //prototype for gameState fuction 
int player1, player2, draw, player, winner, done; //creates variables to be used. 
int row, col;    //creates variables to be used in gamestate function 

public: 
int TtlGames, TtlP1, TtlP2, TtlDraws; //creates variables that will define gamestate 
void intBoard();      //prototype for intboard 
}; 
#endif 

Следующий один вид долго.

Board.cpp

#include "Board.hpp" 

    #include <iostream> 
    #include <iomanip> 


    void TTTBoard::intBoard()    //function to initialize the board 
    {          //initialzes the variables in order 
    done = false;      // to be used for later functions 
    winner = 0; 
    player = 2; 
    player1 = 1; 
    player2 = 2; 
    draw = 3; 
    int i, k; 
    for (k = 0; k<3; k++)    //initializes array to 0 
    { 
     for (i = 0; i<3; i++) 
     { 
      Board[k][i] = 0; 
     } 
    } 
    play();        //begins the game 
    } 


    int TTTBoard::check(int row, int col) //checks if spot if occupied 
    { 
    if (Board[row][col] == 0) 
    { 
     return true; 
    } 
    else if (Board[row][col] != 0) 
    { 
     std::cout << "That square is already taken."; 
     return false; 
    } 
    else 
    { 
     std::cout << "Checking for win."; 
     gameState(Board); 
    } 
    return false; 
    } 

    void TTTBoard::makeMove()   //records players move 
    { 
    player = turn(player); 
    int answer = false; 
    while (answer == false) 
    { 
     std::cout << "Player" << turn(player) << ": please enter your move\n"; 
     std::cin >> row, col; 
     answer = check(row, col); 
    } 

    if (player == 1) 
     Board[row][col] = 'X'; 
    else if (player == 2) 
     Board[row][col] = 'O'; 
    else 
     std::cout << "Failed."; 
} 

int TTTBoard::gameState(char x[][3]) //checks for a win or a draw 
{ 
    winner = 0; 
    int count = 0; 
    int a = row; 
    int b = col; 
    for (a = 0; a<3; a++) 
    { 
     for (b = 0; b<3; b++) 
     { 
      if (Board[a][b] == 0) 
      { 
       count++; 
      } 
     } 
    } 
    if (count > 0) 
    { 
     int row, col, xCheck, oCheck; 
     for (row = 0; row<3; row++) 
     { 
      xCheck = 0; 
      oCheck = 0; 

      for (col = 0; col<3; col++) 
      { 
       if (x[row][col] == 'X') 
        xCheck++; 
       if (x[row][col] == 'O') 
        oCheck++; 
       if (oCheck == 3) 
       { 
        winner = 2; 
       } 
       if (xCheck == 3) 
       { 
        winner = 1; 
       } 
      } 
     } 
     for (col = 0; col<3; col++) 
     { 
      xCheck = 0; 
      oCheck = 0; 
      for (row = 0; row<3; row++) 
      { 
       if (x[row][col] == 'X') 
        xCheck++; 
       if (x[row][col] == 'O') 
        oCheck++; 
       if (oCheck == 3) 
       { 
        winner = 2; 
       } 
       if (xCheck == 3) 
       { 
        winner = 1; 
       } 
      } 
     } 
     if (x[0][0] == 'X' && x[1][1] == 'X' && x[2][2] == 'X') 
     { 
      winner = 1; 
     } 
     else if (x[0][0] == 'O' && x[1][1] == 'O' && x[2][2] == 'O') 
     { 
      winner = 2; 
     } 
     else if (x[2][0] == 'X' && x[1][1] == 'X' && x[0][2] == 'X') 
     { 
      winner = 1; 
     } 
     else if (x[2][0] == 'O' && x[1][1] == 'O' && x[0][2] == 'O') 
     { 
      winner = 2; 
     } 
    } 
    else if (count == 9) 
    { 
     std::cout << "Its a draw."; 
     winner = 3; 
    } 
    else 
    { 
     std::cout << "It is the next players turn\n\n"; 
    } 
    if (winner > 0) 
    { 
     done = true; 
    } 
    return done; 
} 


void TTTBoard::print(char Board[][3])  //prints current board state 
{ 
    std::cout << "\n"; 
    std::cout << " 0 1 2\n"; 
    std::cout << "0 " << Board[0][0] << " " << Board[0][1] << " " << Board[0][2] << " \n"; 
    std::cout << "1 " << Board[1][0] << " " << Board[1][1] << " " << Board[1][2] << " \n"; 
    std::cout << "2 " << Board[2][0] << " " << Board[2][1] << " " << Board[2][2] << " \n"; 
} 

Это один также долго.

TicTacToe.hpp

#ifndef TICTACTOE_HPP 
#define TICTACTOE_HPP 

#include "Board.hpp" 
#include <iostream> 
#include <string> 
#include <iomanip> 

class Board;  //creates a board to be forward declared 

class TicTacToe  //creates tictactoe class 
{ 
private: 
    int check(int, int); 
    int turn(int player); 
    int play();      //prototype for play method 
    int gameState(char x[][3]); 
public: 
    int TtlGames, TtlP1, TtlP2, TtlDraws; 
    void intBoard(); 
    Board* playBoard;    //forward declarations for use in functions 
    Board* print; 
    Board* makeMove; 
    Board* BoardT; 
}; 

#endif 

tictactoe.cpp

#include "Board.hpp" 
#include "TicTacToe.hpp" 

#include <iostream> 
#include <string> 

void TTTBoard::intBoard()  //initializes board 
{ 
    done = false; 
    winner = 0; 
    player = 2; 
    player1 = 1; 
    player2 = 2; 
    draw = 3; 
    int i, k; 
    for (k = 0; k<3; k++) 
    { 
     for (i = 0; i<3; i++) 
     { 
      Board[k][i] = 0; 
     } 
    } 
    play(); 
} 

int TicTacToe::turn(int player)   //informs players of whose turn it is. 
{ 
    switch (player) 
    { 
    case 1: player = 2; 
    { 
     std::cout << "\nPlayers 1 turn.\n\n"; 
     break; 
    } 
    case 2: player = 1; 
    { 
     std::cout << "\nPlayers 2 turn.\n\n"; 
     break; 
    } 
    } 
    return player; 
} 

int TTTBoard::gameState(char x[][3])  //checks for win or draw 
{ 
    winner = 0; 
    int count = 0; 
    int a = row; 
    int b = col; 
    for (a = 0; a<3; a++) 
    { 
     for (b = 0; b<3; b++) 
     { 
      if (Board[a][b] == 0) 
      { 
       count++; 
      } 
     } 
    } 
    if (count > 0) 
    { 
     int row, col, xCheck, oCheck; 
     for (row = 0; row<3; row++) 
     { 
      xCheck = 0; 
      oCheck = 0; 

      for (col = 0; col<3; col++) 
      { 
       if (x[row][col] == 'X') 
        xCheck++; 
       if (x[row][col] == 'O') 
        oCheck++; 
       if (oCheck == 3) 
       { 
        winner = 2; 
       } 
       if (xCheck == 3) 
       { 
        winner = 1; 
       } 
      } 
     } 
     for (col = 0; col<3; col++) 
     { 
      xCheck = 0; 
      oCheck = 0; 
      for (row = 0; row<3; row++) 
      { 
       if (x[row][col] == 'X') 
        xCheck++; 
       if (x[row][col] == 'O') 
        oCheck++; 
       if (oCheck == 3) 
       { 
        winner = 2; 
       } 
       if (xCheck == 3) 
       { 
        winner = 1; 
       } 
      } 
     } 
     if (x[0][0] == 'X' && x[1][1] == 'X' && x[2][2] == 'X') 
     { 
      winner = 1; 
     } 
     else if (x[0][0] == 'O' && x[1][1] == 'O' && x[2][2] == 'O') 
     { 
      winner = 2; 
     } 
     else if (x[2][0] == 'X' && x[1][1] == 'X' && x[0][2] == 'X') 
     { 
      winner = 1; 
     } 
     else if (x[2][0] == 'O' && x[1][1] == 'O' && x[0][2] == 'O') 
     { 
      winner = 2; 
     } 
    } 
    else if (count == 9) 
    { 
     std::cout << "Its a draw."; 
     winner = 3; 
    } 
    else 
    { 
     std::cout << "It is the next players turn\n\n"; 
    } 
    if (winner > 0) 
    { 
     done = true; 
    } 
    return done; 
} 

int TicTacToe::play()  //initializes the game 
{ 
    int done = false; 
    Board* print(Board); 
    while (!done) 
    { 
     int count = 0; 
     Board* makeMove(); 
     Board* (Board); 
     count++; 
     if (count != 9) 
     { 
      return !done; 
     } 
     else 
     { 
      done = true; 
     } 
    } 
    return 0; 
} 

int main()    //main method 
{ 
    TicTacToe playGame; 
     playGame.TtlGames = 0, playGame.TtlP1 = 0, 
      playGame.TtlP2 = 0, playGame.TtlDraws = 0;     //counters for total games, Player 1 Total, 
    int Winner = 0;              //Player 2 Total , and Total draws. 

    char done = false; 

    while (!done) 
    { 
     // This will display before each game 
     std::cout << "Let's play a game of TicTacToe\n\n"; 

     // Play a game and remember who won (if anyone) 
     playGame.intBoard(); 

    } 

    // Finish 
    std::cout << "\n\nThank you for playing!\n"; 
    std::cin.get(); 
    std::cin.get(); 
    return 0; 
} 

Я попытался предложение по Code Фуллера, но он дал мне эту ошибку.

/usr/lib/gcc/x86_64-redhat-linux/4.4.7/../../../../lib64/crt1.o: In function `_start': 
(.text+0x20): undefined reference to `main' 
collect2: ld returned 1 exit status 

Поэтому я подумал, что, если я положу метод Main в отдельный файл и свяжу их все, что он может сработать. Я получил это:

/tmp/ccmSwwUz.o: In function `TTTBoard::intBoard()': 
TicTacToe.cpp:(.text+0x0): multiple definition of `TTTBoard::intBoard()' 
/tmp/ccSwOY9D.o:Board.cpp:(.text+0x0): first defined here 
/tmp/ccmSwwUz.o: In function `TTTBoard::gameState(char (*) [3])': 
TicTacToe.cpp:(.text+0x104): multiple definition of `TTTBoard::gameState(char (*   ) [3])' 
/tmp/ccSwOY9D.o:Board.cpp:(.text+0x288): first defined here 
/tmp/ccSwOY9D.o: In function `TTTBoard::intBoard()': 
Board.cpp:(.text+0xa7): undefined reference to `TTTBoard::play()' 
/tmp/ccSwOY9D.o: In function `TTTBoard::makeMove()': 
Board.cpp:(.text+0x176): undefined reference to `TTTBoard::turn(int)' 
Board.cpp:(.text+0x19b): undefined reference to `TTTBoard::turn(int)' 
/tmp/ccmSwwUz.o: In function `TTTBoard::intBoard()': 
TicTacToe.cpp:(.text+0xa7): undefined reference to `TTTBoard::play()' 
/tmp/ccz4019v.o: In function `main': 
Main.cpp:(.text+0x48): undefined reference to `TicTacToe::intBoard()' 
collect2: ld returned 1 exit status 

Итак, я попытался компиляции совета в объект первого затем соединяющего TicTacToe и Main:

g++ Board.o TicTacToe.cpp Main.cpp -o TTT 

и получил следующие ошибки:

/tmp/cc9h5kAs.o: In function `TTTBoard::intBoard()': 
TicTacToe.cpp:(.text+0x0): multiple definition of `TTTBoard::intBoard()' 
Board.o:Board.cpp:(.text+0x0): first defined here 
/tmp/cc9h5kAs.o: In function `TTTBoard::gameState(char (*) [3])': 
TicTacToe.cpp:(.text+0x104): multiple definition of `TTTBoard::gameState(char (*) [3])' 
Board.o:Board.cpp:(.text+0x288): first defined here 
Board.o: In function `TTTBoard::intBoard()': 
Board.cpp:(.text+0xa7): undefined reference to `TTTBoard::play()' 
Board.o: In function `TTTBoard::makeMove()': 
Board.cpp:(.text+0x176): undefined reference to `TTTBoard::turn(int)' 
Board.cpp:(.text+0x19b): undefined reference to `TTTBoard::turn(int)' 
/tmp/cc9h5kAs.o: In function `TTTBoard::intBoard()': 
TicTacToe.cpp:(.text+0xa7): undefined reference to `TTTBoard::play()' 
/tmp/ccZlZ4Dn.o: In function `main': 
Main.cpp:(.text+0x48): undefined reference to `TicTacToe::intBoard()' 
collect2: ld returned 1 exit status 
+2

Пожалуйста выкладываю полную команду, используемую для компиляции. – Nard

+0

Side-Note: Это не имеет большого значения, поскольку вы включаете в себя защитные элементы ('# ifndef'), но вы не хотите включать' Board.hpp' в 'TicTacToe.cpp', так как вы включили его в заголовочный файл TicTacToe , Вы также включили 'iostream' в каждый файл. –

+0

Я использовал следующую команду на машине Linux: g ++ Board.hpp Board.CPP TicTacToe.hpp TicTacToe.CPP -o TicTacToe –

ответ

-1

Вы пытаетесь для компиляции Board.cpp в исполняемый файл, в то время как он не содержит «главную» точку входа. Вы должны скомпилировать Board.cpp в файл объекта первый:

gcc Board.cpp -c 

Затем вы можете скомпилировать tictactoe.cpp и связать его с Board.o:

gcc Board.o TicTacToe.cpp -o TicTacToe 
+0

Вы должны подождать, пока сообщение не добавит информацию, чтобы дать вашей гипотезе о ноге, чтобы стоять. –

+0

Ошибка «В функции' _start ': (.text + 0x20): неопределенная ссылка на 'main' '- распространенная ошибка, вызванная неправильным использованием gcc, описанным мной. – CodeFuller

+0

Можете также отредактировать свой ответ, чтобы включить все возможные неправильные использования gcc, относящиеся к информации, предоставленной OP, в результате чего эта ошибка. Я не говорю, что ваш ответ * не может быть прав, я говорю, что нет никакого способа узнать, пока OP не добавит информацию к его вопросу. –

Смежные вопросы