2013-11-10 2 views
0

У меня проблема с этим кодом, это файл заголовка (stack.h) из лабиринтной программы. Я изучал структуру Stack, и в моих документах я не мог понять эти типы структур, может ли кто-нибудь объяснить мне, почему мы используем typedef и как работает 12-я и 21-я строка?typedef use в определении структуры

#ifndef STACK_H 
    #define STACK_H 
    #define STACKSIZE 50 

    typedef struct d { 
     int x; 
     int y; 
     int right; int left; 
     int down; 
     int up; 
     int camefrom; 
     } StackDataType, position;   /// LINE 12 

    struct STACK{ 
     StackDataType element[STACKSIZE]; int top; 
     void create(); 
     void close(); 
     bool push(StackDataType); StackDataType pop(); 
     bool isempty(); 
    }; 
    typedef struct STACK Stack;    /// LINE 21 
    #endif 
+0

Первая ссылка после [googling typedef] (http://en.wikipedia.org/wiki/Typedef) – P0W

+0

Невозможно подсчитать до строки 21, но строка 12 ('StackDataType, position;') предоставляет экземпляры typedef для структуры что неверно синтаксис C++. –

+0

Здесь нет веских причин использовать typedef. Этот код написан очень странно. Это похоже на C-код, частично перенесенный на C++. Я бы не потратил слишком много времени на изучение этого. Хороший код на C++ не похож на этот. – john

ответ

1

Я думаю, что вам не нужно, чтобы на структуру определение типа во вновь C++, он снова определяет на структуру, которая не является необходимым. Вы можете просто определить:

struct d{ 

}; 
0

Я вижу две проблемы: Во-первых, таинственный символ в определении d структуры. Во-вторых, вы используете typedef для этой структуры, но имеете что-то после typename StackDataType. Вторая ошибка, которую вы получаете, вероятно, только из-за первой, очень часто в C и C++ возникают ошибки в несвязанных линиях из-за предыдущих ошибок.

Кроме того, на C++ вам действительно не нужны typedef для структур, поскольку они такие же, как и классы, например. struct StackDataType {...}; позволит вам использовать StackDataType как тип.

+0

Какой таинственный символ вы имеете в виду? Я не мог этого видеть. Спасибо за ответ. – fucicek

+0

@fucicek Существует символ не-ASCII между последней новой строкой (после объявления 'gotfrom') и закрывающей скобкой. Посмотрите на код, который вы опубликовали. –

0

В C++ вам не нужен typedef вот так. На самом деле сейчас это странно. Ниже код достаточно, чтобы сделать новый тип:

struct foo { 
    ... 
}; 

 

В старые времена, вы должны были явно ЬурейеЕ структур, чтобы избежать использования struct везде. Например:

typedef struct { 
} foo; 

// or 

struct foo { 
}; 
typedef struct foo foo; 

иначе вы должны были использовать struct перед любым использованием foo:

struct foo f; 

В лице struct foo вместе был тип и foo не было (если вы явно не сделали его тип, typedef)

 


Наконец, ваш код может выглядеть так:

#ifndef STACK_H 
#define STACK_H 

#define STACKSIZE 50 

struct StackDataType 
{ 
    int x; 
    int y; 
    int right; 
    int left; 
    int down; 
    int up; 
    int camefrom; 
}; 

// typedef StackDataType position; 

struct Stack 
{ 
    StackDataType element[STACKSIZE]; 
    int top; 
    void create(); 
    void close(); 
    bool push(StackDataType); 
    StackDataType pop(); 
    bool isempty(); 
}; 

#endif 
+0

_in old days_ o_O;) – P0W

+0

Я знаю, что вы правы, но в документах структуры данных моей школы заголовочный файл полностью подобен этому, я понятия не имею, почему. Спасибо за ответ, кстати. – fucicek

+0

@fucicek: Файлы заголовков, возможно, должны объявить их такими, чтобы соответствовать некоторой обратной совместимости - я обновил свой ответ. – deepmax

0

Что происходит в том, что по существу typedef используется для создания сокращенного способа обратиться к данной структуре.

Таким образом, в этом примере, как StackDataType и position являются сокращенными ссылками на то, что формально объявлен как struct d и Stack является сокращенной ссылкой на то, что официально объявлено struct STACK.

Вообще говоря, это позволяет использовать более чистый код, ссылающийся на эти структуры. Например., Вместо того, чтобы написать:

struct STACK var; 

объявить экземпляр этой структуры, вы можете просто использовать:

Stack var; 

Вы можете объявить ЬурейеЕ либо в той же точке, в которой вы объявляете тип (как в первом примере), или вы можете объявить его позже (как во втором).

+0

Спасибо за ответ, это действительно помогло. – fucicek

0

В моем (значительном) опыте это почти всегда означает программист на C, который пошарил в C++. Если это заметки из ваших классов, это не сулит ничего хорошего.

В ранней «C», если объявлен struct

struct StructName { 
    int a; 
    int b; 
}; 

Это не объявлял имя типа, оно только объявлено имя структуры, так, чтобы сделать экземпляр StructName вы должны написать:

struct StructName myStruct; 

Если вы хотите, чтобы иметь возможность опустить «StructName» часть, которую вы должны были бы использовать ЬурейеЕ:

struct StructName { int a, b; }; 
typedef struct StructName StructName; 

Или вы могли бы объединить их в один, несколько запутанный, заявление:

typedef struct StructName { int a, b; } StructName; 

Я говорю запутанным, потому что если struct определение давно много линий, можно спутать второй синтаксис C, который позволяет объявить экземпляр из Struct после определения типа:

struct StructName { int a, b; } StructName; 
// aka 
struct StructName { int a, b; }; 
struct StructName StructName; // local variable, StructName of type struct StructName 
// declare a VARIABLE called StructName which is of type anonymous-struct. 
struct { int a, b; } StructName; 

Одна проблема состоит в том, что вы не можете использовать typedef'd имя в структуре декларации:

// Won't compile because 'List' isn't declared until the end. 
typedef struct list_structure { List* next; int a; } List; 

// Won't compile because you have to remember to say 'struct List' 
typedef struct List { List* next; int a; } List; 

// Compiles 
typedef struct list_structure { struct list_structure* next; int a; } List; 

Это путало много программистов на С. Настолько, что многие программисты C скажут вам, что определение структуры является

typedef struct tag_name { /* struct details */ } structname; 
//e.g. 
typedef struct tagStructName { int a, b; } StructName; 

C++ унаследовал все это, но и пошел вперед и сделал ЬурейеЕ подразумеваемой для вас:

// doesn't compile as C, will compile as C++ 
struct List { 
    List* next; 
    int a; 
}; 

Чтобы увидеть он не компиляции в C: http://ideone.com/3r9TRy

В C++ объявить что-то, как класс точно же, как объявить его на структуру, с одним изменением:

class List { 
    List* next; 
public: 
    int a; 
}; 

Является ТОЧНО как если бы вы написали:

struct List { 
private: 
    List* next; 
public: 
    int a; 
}; 

Там нет другой разницы между struct и class в C++.

+0

Большое спасибо за ваш ответ, это очень полезно. – fucicek

Смежные вопросы