我正在创建一个类,我在其中定义了一个名为“Room”的Struct,我在头文件中声明为private。我有几个公共函数需要“房间”作为参数。当我编译时(用g ++)我得到一个错误说:
Graph.h:42:17: error: "Room" has not been declared
然而,这里有声明(现在整个头文件):
#ifndef GRAPH_H
#define GRAPH_H
#include <iostream>
#include <string>
using namespace std;
class Graph {
public:
// destructor
~Graph();
// copy constructor
Graph(const Graph &v);
// assignment operator
Graph & operator = (const Graph &v);
//Create an empty graph with a potential
//size of num rooms.
Graph( int num );
//Input the form:
//int -- numRooms times
//(myNumber north east south west) -- numRooms times.
void input(istream & s);
//outputs the graph as a visual layout
void output(ostream & s) const;
//Recursively searches for an exit path.
void findPath( Room start );
//Moves room N E S or W
void move( Room &*room , String direction );
//inputs the starting location.
void inputStart( int start );
//Searches the easyDelete array for the room with the
//number "roomNumber" and returns a pointer to it.
const Room * findRoom( int roomNumber );
private:
struct Room
{
bool visted;
int myNumber;
Room *North;
Room *East;
Room *South;
Room *West;
};
int numRooms;
int _index;
int _start;
Room ** easyDelete;
string * escapePath;
Room * theWALL;
Room * safety;
};
#endif
您是否不允许使用头文件中定义的结构作为参数?如果是这样,那么解决方法是什么?
感谢。
答案 0 :(得分:1)
没有private:
标题,它编译得很好。你为什么这么做?结构是在类中声明的吗?
修改强>
您在宣布之前使用了Room
:
const Room * findRoom( int roomNumber );
此外,您无法通过已声明的公共方法返回Room
对象,因为外部代码不会对此有所了解。
您需要在使用它之前预先声明它:
class Graph {
public:
struct Room;
const Room * findRoom( int roomNumber );
struct Room
{
bool visted;
int myNumber;
Graph::Room *North;
Graph::Room *East;
Graph::Room *South;
Graph::Room *West;
};
Room room;
};
int main (){
Graph x;
return 0;
}
或者您可以在private
部分上方向上移动第二个public
。
答案 1 :(得分:1)
如果您使用嵌套结构作为包含类的方法的参数,则必须使用完全限定名称,例如void outerclass::mymethod(outerclass::room);
。您可能也需要公开它。
答案 2 :(得分:1)
要么向前声明如下:
struct Room;
// destructor
~Graph();
或者只是在课堂顶部使用它之前声明并实现它。
void move( Room &*room , String direction ); //this is not valid C++
答案 3 :(得分:1)
在使用之前,您必须声明任何类型。前向声明就足够了,因为您在同一范围内定义Graph::Room
。但是,既然你必须要定义它,我建议在第一次使用它之前将其移动到某个点。
在Room
内私有Graph
是完全合法的(但如果你的公共接口与之相遇,那么它是否合理是值得怀疑的。)
旁注:引用的指针不是有效类型(对指针的引用是!)。因此,您的move
功能无效。