C++ 错误 1 错误 C2146:语法错误:标识符'records'之前缺少';'

C++ Error 1 error C2146: syntax error: missing ';' before identifier 'records'

本文关键字:错误 records 语法 标识符 C++ C2146      更新时间:2023-10-16

TicTacToe.h

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

收割台.h

#include <iostream>
#include <vector>
#include <map>
#include <string>
#include <fstream>
#include <algorithm>
#include "Records.h"
#include "TicTacToe.h"
using namespace std;

记录.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头文件

有多少冲突。

首先

  • 永远不要在头文件中使用无用的include
  • 永远不要在头文件中使用命名空间

TicTacToe.h中,您包括"Header.h",它包括<cTacTOe.h">本身:递归。

第二

"#pragmaonce"不是标准的,所以我建议使用实例:

#ifndef RECORDS_H_
#define RECORDS_H_
class Records {
}
#endif

如果你真的想使用"#pragma once",请先学会使用:它应该是第一条指令,至少在所有"inclues"之前。

第三

  • 使用关键字"private",即使它是隐含的
  • 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

记录.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

Main:

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

第四:

Records类是完全错误的:它有一个Records*的std::向量,这使得它是递归的
你应该有一个例子:

记录.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();
    };

记录.h

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

至少对我来说,这更有意义。

您需要保护Header.h文件。只需将#pragma once放在顶部,就像您对Records.h 所做的那样