и я борюсь с функцией, которая должна возвращать вектор объектов, но по какой-то причине она постоянно вызывает ошибки, заявляя, что мой объект является незаявленным идентификатором, а вектор этих объектов недействителен и указывает мне на файл.h, где я объявляю функцию. Я объясню, что это значит и как это исправить. ниже я размещаю код из своего класса и стартовых файлов.
#ifndef SETUPW_H
#define SETUPW_H
#include"Square.h"
#include <iostream>
#include<string>
#include<fstream>
#include<vector>
std::vector<std::ifstream> allText();
std::ifstream loadTxt(std::string txt);
void printByLine(std::ifstream& txt);
std::vector<square> allSquares();//compiler points me to this line and that one bellow
void whichSQ(int sqNum, std::vector<square> sq);
#endif
и мой класс:
#ifndef SQUARE_H
#define SQUARE_H
#include"player.h"
#include"setupW.h"
#include<iostream>
#include<string>
#include<fstream>
class square
{
public:
square(std::string name, int sqNumber, std::string description, int exits, int object);
void loadSQ(std::ifstream& inFile);
void printSQ();
private:
int mSqNumber;
std::string mName;
std::string mDescription;
int mExits;
int mObject;
};
#endif
Проблема возникает из-за того, что здесь есть круговая зависимость. В square.cpp
вы сначала включаете square.h
. Но square.h
содержит эту строку #include"setupW.h"
(перед объявлением класса). Таким образом, объявления ваших функций появятся перед объявлением вашего square
класса. Это заставляет компилятор пробормотать, что square
не объявлен (в то время), когда он читает std::vector<square>
.
Самым простым решением было бы просто удалить include, потому что это, насколько я могу судить, неслучайно.
std::string
в вашем заголовочном файле, вы должны будете включить его туда, но если вам нужен только std::string
в вашей реализации, включите его в файл .cpp, а не в свой заголовок. файл
std::vector
требует, чтобы класс был копируемым. Просто определите конструктор копирования.square.h
не должен включатьsetupW.h
если это первый фрагмент.