Использование структур в качестве аргументов: Ошибка: структура не определена - PullRequest
1 голос
/ 11 декабря 2011

Я создаю класс, в котором я определил структуру с именем «Комната», которую я объявил как частную в заголовочном файле.У меня есть несколько открытых функций, которые требуют «Комната» в качестве аргумента.Когда я компилирую (в 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 ]

2 голосов
/ 11 декабря 2011

Прекрасно компилируется без заголовка 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 голос
/ 11 декабря 2011

Вы должны объявить любой тип перед использованием.Предварительного объявления достаточно, потому что вы определяете Graph::Room в той же области.Однако, поскольку вы все равно должны определить его, я бы предложил переместить его до некоторой точки, прежде чем впервые его использовать.

Делать Room частным в Graph совершенно законно (сомнительно, если это разумнотем не менее, если ваш публичный интерфейс возится с ним).

С другой стороны: Указатели на ссылки не являются допустимыми типами (ссылки на указатели есть!).Поэтому ваша move функция недействительна.

1 голос
/ 11 декабря 2011
  1. Комната не может быть закрытой, поскольку вы используете ее в своих публичных функциях.
  2. Либо нападающий объявить это так:

    struct Room;
    // destructor
    ~Graph();
    
  3. Или просто объявите и реализуйте его, прежде чем использовать его в верхней части класса.

  4. void move( Room &*room , String direction ); //this is not valid C++
1 голос
/ 11 декабря 2011

Если вы используете вложенную структуру в качестве аргумента для метода содержащего класса, то вы должны использовать полное имя, такое как void outerclass::mymethod(outerclass::room); Попробуйте это.Возможно, вам также придется сделать это публичным.

...