0

このコードに問題があります。これは、迷路プログラムのヘッダー ファイル (stack.h) です。私はスタック構造を勉強していましたが、私のドキュメントでは、これらのタイプの構造を理解できませんでした.typedefを使用している理由と、12行目と21行目がどのように機能するかを誰かに説明してもらえますか??

    #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
4

5 に答える 5

1

私の (かなりの) 経験では、これはほとんどの場合、C++ に手探りで進んだ C プログラマーを示しています。これらがあなたのクラスからのメモである場合、それは良い前兆ではありません.

最初の「C」で、宣言した場合struct

struct StructName {
    int a;
    int b;
};

これは型名を宣言せず、構造体名のみを宣言したため、StructName のインスタンスを作成するには、次のように記述する必要があります。

struct StructName myStruct;

「StructName」部分を省略できるようにしたい場合は、typedef を使用する必要があります。

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

または、これらを 1 つのやや紛らわしいステートメントにまとめることができます。

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

struct定義が何行も長い場合、型を定義した後に Struct のインスタンスを宣言できる 2 番目の C 構文と混同される可能性があるため、わかりにくいと言います。

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;

これに関する 1 つの問題は、構造宣言で typedef された名前を使用できないことです。

// 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 プログラマーを混乱させました。多くの C プログラマーが構造体の定義は

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

C++ はこれらすべてを継承しましたが、先に進んで typedef を暗黙的にしました。

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

C としてコンパイルされていないことを確認するには: http://ideone.com/3r9TRy

C++ では、何かをクラスとして宣言することは、それを構造体として宣言することとまったく同じですが、1 つの変更があります。

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

あなたが書いたかのように正確です:

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

C++ では、astructと a の間に他に違いはありません。class

于 2013-11-10T20:57:02.103 に答える
0
于 2013-11-10T20:34:31.620 に答える
0

In C++ you don't need typedef like that. In fact it's weird now. Below code is enough to make a new type:

struct foo {
     ...
};

 

In old days, you had to explicitly typedef structures to avoid using struct everywhere. For example:

typedef struct {
} foo;

// or

struct foo {
};
typedef struct foo foo;

otherwise you had to use struct before any usage of foo:

struct foo f;

In face struct foo together was a type and foo was not (unless you explicitly made it a type by typedef)

 


Finally, your code can be like this:

#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
于 2013-11-10T20:34:40.720 に答える