2013-11-24 53 views
0

和我奋斗的功能,它应该返回对象的向量,但由于某种原因,它始终抛出错误,告诉我的对象是未声明的标识符和此对象的向量是无效的模板和指向我声明函数的.h文件。 我会适当解释这是什么意思,以及如何解决这个问题。以下是我放置我的课程代码并启动文件的代码。C++如何声明函数返回对象的向量

#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 
+0

'std :: vector'要求类是可复制的。只需定义一个拷贝构造函数。 –

+1

你的头卫兵在第一个片段中是错误的。如果这是第一个片段,'square.h'不应该包含'setupW.h'。 – Mat

+0

@GuilhermeBernal,除非明确做出不可复制的内容,否则所有类都是可复制的(可能在逻辑上不正确)。 – StoryTeller

回答

1

问题就出现了,因为你在这里有一个循环依赖。在square.cpp你首先包括square.h。但square.h包含此行#include"setupW.h"(在您的类声明之前)。因此,您的职能声明将出现在您的square课程申报之前。这会导致编译器嘀咕square未被声明(当时),当他读取std::vector<square>时。

最简单的解决方案是简单地删除包含,因为据我所知,这是不必要的。

+0

就是这样,非常感谢。如果你知道我的意思,我很确定我需要将所有的.h文件包含在所有其他文件中。我没有意识到这可能会导致问题。再次感谢。 –

+0

@SzarleyDwarf一个好的方法是保持包含最小化,只包含头文件中真正需要的文件。例如,如果你想在你的头文件中声明一个'std :: string'成员,你将不得不在你的头文件中包含它,但是如果你在你的实现中只需要'std :: string',那么将它包含在.cpp文件中,不在你的头文件 – Paranaix

+0

谢谢你,现在我知道将来不会在其他文件中包含所有.h文件:) –