使用结构作为参数:错误:结构未定义

时间:2011-12-11 02:32:13

标签: c++ struct g++

我正在创建一个类,我在其中定义了一个名为“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

您是否不允许使用头文件中定义的结构作为参数?如果是这样,那么解决方法是什么?

感谢。

4 个答案:

答案 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)

  1. 由于您在公共会员功能中使用会议室,因此无法保密。
  2. 要么向前声明如下:

    struct Room;
    // destructor
    ~Graph();
    
  3. 或者只是在课堂顶部使用它之前声明并实现它。

  4. void move( Room &*room , String direction ); //this is not valid C++

答案 3 :(得分:1)

在使用之前,您必须声明任何类型。前向声明就足够了,因为您在同一范围内定义Graph::Room。但是,既然你必须要定义它,我建议在第一次使用它之前将其移动到某个点。

Room内私有Graph是完全合法的(但如果你的公共接口与之相遇,那么它是否合理是值得怀疑的。)

旁注:引用的指针不是有效类型(对指针的引用是!)。因此,您的move功能无效。