2014-09-10 2 views
0

tictactoe.hС ++ Ошибка ошибка C2146: синтаксическая ошибка: отсутствует ';' Перед 'записей' идентификатора

#pragma once 
#include "Header.h" 

class TicTacToe 
{ 
    vector<char>tictac_array; 
    Records records; 
public: 
    TicTacToe(); 

    ~TicTacToe(); 

    void push_tictac_array(); 

    int wincheck(); 

    void board(string player1, string player2); 

    void start(); 

    void mainmenu(); 
}; 

header.h

#include <iostream> 
#include <vector> 
#include <map> 
#include <string> 
#include <fstream> 
#include <algorithm> 
#include "Records.h" 
#include "TicTacToe.h" 

using namespace std; 

Records.h

#pragma once 
#include "Header.h" 

class Records 
{ 
protected: 
    vector<Records*> rec; 
    string player; 
    int wins; 
    int games; 
    int draws; 
public: 
    Records(); 
    Records(string player, int wins, int games, int draws); 

    ~Records(); 

    void setName(string player); 

    void setWins(int wins); 

    void setGames(int games); 

    void setDraws(int draws); 

    string getName(); 

    int getWins(); 

    int getGames(); 

    int getDraws(); 

    void addRec(string player, int wins, int games, int draws); 

    void sortStats(); 

    void outRec(); 

    void saveTo(); 

    void readFrom(); 
}; 

main.cpp

#include "Header.h" 

const int NotUsed = system("color F0"); 


void main() 
{ 
    setlocale(0, "rus"); 
    TicTacToe tictac; 
    tictac.records.readFrom(); 
    tictac.mainmenu(); 
} 

Перед пробой на файлы и все работает отлично. Только после распространения всех файлов классов, начал выдавать эту ошибку, что может быть проблемой? Добавлен заголовочный файл Records.h

+2

И 'Records.h'? – WhozCraig

+1

Я подозреваю круглый путь #include, например. 'Records.h', включая' TicTacToe.h' через какой-то маршрут. –

+3

Как замечание, никогда не рекомендуется помещать декларацию 'using namespace' в заголовочный файл, так как все, что включает этот заголовок, получит это. Я понимаю, что это, вероятно, поведение, которое вы хотите на данный момент, гораздо безопаснее поставить эту декларацию в ваши файлы '.cpp' или, еще лучше, полностью квалифицировать свои ссылки. – TartanLlama

ответ

1

Вам необходимо защитить файл Header.h. Просто положите #pragma once наверху, как вы это сделали для Records.h

3

Сколько конфузов.

Прежде всего:

  • never use useless include in header files.
  • never use namespace in header files.

В tictactoe.h включить "header.h", который включает в себя "tictactoe.h" сам: рекурсию.

Второй:

"#pragma once" is not standard, so I recommend to use instance:

#ifndef RECORDS_H_ 
#define RECORDS_H_ 

class Records { 
} 

#endif 

Если вы действительно хотите использовать "#pragma once", научиться использовать его раньше: она должна быть первой инструкцией, по крайней мере, до всех «inclues», в целом.

Третий:

  • использование ключевого слова 'частный' даже трудно это неявно;
  • Метод get должен быть const;
  • передавать параметры по ссылкам, избегать бесполезной копии.

tictactoe.h

#ifndef TICTACTOE_H_ 
#define TICTACTOE_H_ 

#include <vector> 

#include "Records.h" 

class TicTacToe { 
private: 
    std::vector<char> tictac_array; 
    Records records; 
public: 
    TicTacToe(); 
    ~TicTacToe(); 
    void push_tictac_array(); 
    int wincheck(); 
    void board(const std::string& player1, const std::string& player2); 
    void start(); 
    void mainmenu(); 
}; 

#endif 

Records.h

#ifndef RECORDS_H_ 
#define RECORDS_H_ 

#include <vector> 

class Records { 
protected: 
    std::vector<Records*> rec; 
    string player; 
    int wins; 
    int games; 
    int draws; 
public: 
    Record(); 
    Record(const std::string& player, const int& wins, const int& games,const int& draws); 
    ~Record(); 
    void setName(const std::string& player); 
    void setWins(const int& wins); 
    void setGames(const int& games); 
    void setDraws(const int& draws); 
    string getName() const; 
    int getWins() const; 
    int getGames() const; 
    int getDraws() const; 
    void addRec(const std::string& player, const int& wins, const int& games,const int& draws); 
    void sortStats(); 
    void outRec(); 
    void saveTo(); 
    void readFrom(); 
}; 

#endif 

Главная:

#include <clocale> 
#include <cstdlib> 

#include "TicTacToe.h" 

using namespace std; 

const int NotUsed = system("color F0"); 

void main() { 
    setlocale(0, "rus"); 
    TicTacToe tictac; 
    tictac.records.readFrom(); 
    tictac.mainmenu(); 
} 

Четвертое:

Класс записей совершенно неправильный: у него есть std :: vector записей *, которые делают его рекурсивным.
Вы должны иметь экземпляр:

Record.h

class Record { 
    protected: 
     string player; 
     int wins; 
     int games; 
     int draws; 
    public: 
     Records(); 
     Records(const std::string& player, const int& wins, const int& games,const int& draws); 
     ~Records(); 
     void setName(const std::string& player); 
     void setWins(const int& wins); 
     void setGames(const int& games); 
     void setDraws(const int& draws); 
     string getName() const; 
     int getWins() const; 
     int getGames() const; 
     int getDraws() const; 
     void addRec(const std::string& player, const int& wins, const int& games,const int& draws); 
     void sortStats(); 
     void outRec(); 
     void saveTo(); 
     void readFrom(); 
    }; 

Records.h

class Records : public std::vector<Record*> { 
} 

Это больше смысла, для меня по крайней мере.

+1

'#pragma once' не может быть _de jure_ standard, но это _de facto_; поддержка очень широка для него, и это приводит к меньшему количеству ошибок из-за копирования и не изменяя '# define'. – TartanLlama

+0

(wide! = Total) –

+1

Итак, ваш вариант заключается в использовании превосходного метода, который поддерживается рядом с любым компилятором, который вы будете использовать, или для использования более низкого метода для поддержки тех немногих, которые этого не делают. Я знаю, на что поеду, особенно для игры Tic-Tac-Toe. – TartanLlama

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