C++ c++;如何声明返回对象向量的函数

C++ c++;如何声明返回对象向量的函数,c++,object,vector,C++,Object,Vector,我在处理函数,它应该返回对象的向量,但由于某种原因,它总是抛出错误,告诉我我的对象是未声明的标识符,这个对象的向量不是有效的模板,并指向我声明函数的.h文件。 我将适当解释这意味着什么以及如何解决这一问题。下面我从类和起始文件中放置代码 #ifndef SETUPW_H #define SETUPW_H #include"Square.h" #include <iostream> #include<string> #include<fstream> #incl

我在处理函数,它应该返回对象的向量,但由于某种原因,它总是抛出错误,告诉我我的对象是未声明的标识符,这个对象的向量不是有效的模板,并指向我声明函数的.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设置
#定义设置w_H
#包括“Square.h”
#包括
#包括
#包括
#包括
std::vector allText();
std::ifstream loadTxt(std::string txt);
无效打印署名(std::ifstream&txt);
std::向量allSquares()//编译器将我指向下面这一行和那一行
void whichSQ(int sqNum,std::vector sq);
#恩迪夫
我的班级:

#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
#ifndef SQUARE\u H
#定义平方
#包括“player.h”
#包括“设置W.h”
#包括
#包括
#包括
阶级广场
{
公众:
square(std::string name、int-sqNumber、std::string description、int-exits、int-object);
空荷载SQ(标准::ifstream和INFLE);
void printSQ();
私人:
int-mSqNumber;
std::字符串mName;
std::字符串mDescription;
国际货币基金组织;
国际移动对象;
};
#恩迪夫

出现问题的原因是这里存在循环依赖关系。在
square.cpp
中,首先包括
square.h
。但是
square.h
包含这一行
#包括“setupW.h”
(在类声明之前)。因此,函数的声明将出现在
square
类的声明之前。这会导致编译器在读取
std::vector
时嘀咕说
square
没有声明(当时)


最简单的解决方案是删除include,因为据我所知,它不是必需的。

std::vector
要求类是可复制的。只需定义一个复制构造函数。您的头保护在第一个代码段中是错误的。如果这是第一个代码段,
square.h
不应该包括
setupW.h
。@guilhermbenal,所有类都是可复制的(逻辑上可能不正确)除非显式设置为不可复制。确切的错误是什么?@guilhermbernal如果没有其他说明,编译器会自动创建一个,如果所有成员都可复制,就是这样,非常感谢。如果你知道我的意思的话,我很确定我需要在所有其他文件中包含我的所有.h文件。我不知道这会引起问题。再次感谢。@SzarleyDwarf一个很好的方法是尽量减少包含,只在头文件中包含您真正需要的文件。例如,如果您想在头文件中声明
std::string
成员,则必须将其包含在头文件中,但如果您的实现中只需要
std::string
,则将其包含在.cpp文件中,而不包含在头文件中谢谢您,现在我知道以后不要在其他文件中包含所有.h:)