Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 指向c+;中另一个文件的结构内部的结构的指针+;_C++_Pointers_Struct - Fatal编程技术网

C++ 指向c+;中另一个文件的结构内部的结构的指针+;

C++ 指向c+;中另一个文件的结构内部的结构的指针+;,c++,pointers,struct,C++,Pointers,Struct,我需要创建一个类似于堆栈的程序。 我把所有的功能都做对了。 问题是,我在两个文件中有两个结构,但当我试图将指针放在另一个结构上时,它不允许我这样做 第一个结构在文件“linkedList.h”中声明: 第二个结构在第二个文件“stack.h”中声明: 但当我试图编译它时,它会给我以下错误: 错误C2143:语法错误:缺少“;”在“*”之前 错误C4430:缺少类型说明符-假定为int。注意:C++不支持默认INT/LI> 错误再次指向这一行代码: elements* firstElement;

我需要创建一个类似于堆栈的程序。 我把所有的功能都做对了。 问题是,我在两个文件中有两个结构,但当我试图将指针放在另一个结构上时,它不允许我这样做

第一个结构在文件“linkedList.h”中声明:

第二个结构在第二个文件“stack.h”中声明:

但当我试图编译它时,它会给我以下错误:

  • 错误C2143:语法错误:缺少“;”在“*”之前
  • 错误C4430:缺少类型说明符-假定为int。注意:C++不支持默认INT/LI> 错误再次指向这一行代码:

    elements* firstElement;
    

    如何修复此问题?

    linkedList.h包括stack.h和stack.h包括linkedList.h……您不能这样做。然后,您的
    #ifndef(链接列表)
    /
    #define(定义)链接列表(H)
    使元素最终无法定义

    您需要使用转发声明删除循环依赖项,如下所示

    通过以下方式更改linkedlist.h:

    #ifndef _LINKEDLIST_H
    #define _LINKEDLIST_H
    //#include "stack.h"
    struct myStack;
    
    struct elements{
        int element;
        elements* pNext;
    };
    typedef struct elements elements;
    
    
    void push(myStack *s, int element);  // insert element to top of the stack
    int pop(myStack *s); //remove element from top of the stack
    
    #endif
    

    您还可以创建包含所有函数定义的第三个文件,实际上有很多方法可以解决此问题。

    如果您使用C预处理器处理具有以下行的文件:

    #include "stack.h"
    #include "linkedList.h"
    
    您将看到为什么从“linkedList.h”中选择“stack.h”以及从“linkedList.h”中选择“stack.h”来获取定义会很麻烦

    我试过了

    cpp test.cc
    
    test.cc的内容:

    #include "stack.h"
    #include "linkedList.h"
    
    这就是我得到的:

    # 1 "test.cc"
    # 1 "<command-line>"
    # 1 "test.cc"
    # 1 "stack.h" 1
    
    
    # 1 "linkedList.h" 1
    
    
    # 1 "stack.h" 1
    # 4 "linkedList.h" 2
    
    struct elements{
        int element;
        elements* pNext;
    };
    typedef struct elements elements;
    
    
    void push(myStack *s, int element);
    int pop(myStack *s);
    # 4 "stack.h" 2
    
    struct myStack{
        int maxSize;
        int count;
        bool empty;
        elements* firstElement;
    };
    typedef struct myStack myStack;
    
    void initStack(myStack *s, int size);
    void cleanStack(myStack *s);
    
    
    bool isEmpty(myStack *s);
    bool isFull(myStack *s);
    # 2 "test.cc" 2
    
    这就解释了如果您试图编译
    test.cc
    ,编译器将报告错误的原因

    如果在
    test.cc
    中切换行,将获得不同的输出。这将导致
    元素在其声明可用之前被使用

    解决这个问题的方法是:

  • 不要在“linkedList.h”中包含“stack.h”或在“stack.h”中包含“linkedList.h”
  • 在两个文件中使用前向声明以使用类型
  • 更新的文件:

    linkedList.h:

    #ifndef _LINKEDLIST_H
    #define _LINKEDLIST_H
    #include "stack.h"
    
    struct elements{
        int element;
        elements* pNext;
    };
    typedef struct elements elements;
    
    
    void push(myStack *s, int element);  // insert element to top of the stack
    int pop(myStack *s); //remove element from top of the stack
    
    #endif
    
    #ifndef _LINKEDLIST_H
    #define _LINKEDLIST_H
    
    struct elements{
        int element;
        elements* pNext;
    };
    typedef struct elements elements;
    
    struct myStack; // Use forward declaration of myStack.
    void push(myStack *s, int element);  // insert element to top of the stack
    int pop(myStack *s); //remove element from top of the stack
    
    #endif
    
    #ifndef _LINKEDLIST_H
    #define _LINKEDLIST_H
    
    struct elements{
        int element;
        elements* pNext;
    };
    typedef struct elements elements;
    
                       // myStack can see the definition of elements
    #include "stack.h" // Now myStack available for use
    
    void push(myStack *s, int element);  // insert element to top of the stack
    int pop(myStack *s); //remove element from top of the stack
    
    #endif
    
    堆栈h:

    #ifndef _MYSTACK_H
    #define _MYSTACK_H
    
    struct elements; // Use forward declaration of elements.
    struct myStack{
        int maxSize;
        int count;
        bool empty;
        elements* firstElement;
    };
    typedef struct myStack myStack;
    
    void initStack(myStack *s, int size);
    void cleanStack(myStack *s);
    
    
    bool isEmpty(myStack *s);
    bool isFull(myStack *s);
    
    #endif
    
    #ifndef _MYSTACK_H
    #define _MYSTACK_H
    
    struct myStack{
        int maxSize;
        int count;
        bool empty;
        elements* firstElement;
    };
    typedef struct myStack myStack;
    
    void initStack(myStack *s, int size);
    void cleanStack(myStack *s);
    
    
    bool isEmpty(myStack *s);
    bool isFull(myStack *s);
    
    #endif
    
    更新,回应OP的评论

    在定义
    元素之后,可以
    #在“linkedList.h”中包含
    “stack.h”,并确保
    #仅在编译单元中包含
    “linkedList.h”。如果您在
    #include
    之前只包含“stack.h”或
    #include
    包含“stack.h”
    #include
    ing“linkedList.h”,您将遇到编译器错误

    以下是没有转发声明的更新文件,它们工作正常

    堆栈h:

    #ifndef _MYSTACK_H
    #define _MYSTACK_H
    
    struct elements; // Use forward declaration of elements.
    struct myStack{
        int maxSize;
        int count;
        bool empty;
        elements* firstElement;
    };
    typedef struct myStack myStack;
    
    void initStack(myStack *s, int size);
    void cleanStack(myStack *s);
    
    
    bool isEmpty(myStack *s);
    bool isFull(myStack *s);
    
    #endif
    
    #ifndef _MYSTACK_H
    #define _MYSTACK_H
    
    struct myStack{
        int maxSize;
        int count;
        bool empty;
        elements* firstElement;
    };
    typedef struct myStack myStack;
    
    void initStack(myStack *s, int size);
    void cleanStack(myStack *s);
    
    
    bool isEmpty(myStack *s);
    bool isFull(myStack *s);
    
    #endif
    
    linkedList.h:

    #ifndef _LINKEDLIST_H
    #define _LINKEDLIST_H
    #include "stack.h"
    
    struct elements{
        int element;
        elements* pNext;
    };
    typedef struct elements elements;
    
    
    void push(myStack *s, int element);  // insert element to top of the stack
    int pop(myStack *s); //remove element from top of the stack
    
    #endif
    
    #ifndef _LINKEDLIST_H
    #define _LINKEDLIST_H
    
    struct elements{
        int element;
        elements* pNext;
    };
    typedef struct elements elements;
    
    struct myStack; // Use forward declaration of myStack.
    void push(myStack *s, int element);  // insert element to top of the stack
    int pop(myStack *s); //remove element from top of the stack
    
    #endif
    
    #ifndef _LINKEDLIST_H
    #define _LINKEDLIST_H
    
    struct elements{
        int element;
        elements* pNext;
    };
    typedef struct elements elements;
    
                       // myStack can see the definition of elements
    #include "stack.h" // Now myStack available for use
    
    void push(myStack *s, int element);  // insert element to top of the stack
    int pop(myStack *s); //remove element from top of the stack
    
    #endif
    
    test.cc:

    #include "linkedList.h"
    
    #include "stack.h"
    
    但是,如果您使用:

    test.cc:

    #include "linkedList.h"
    
    #include "stack.h"
    

    您将遇到编译器错误。

    语句,如
    typedef struct elements在C++中不是必需的。您尝试过<代码>结构元素*FielStEng:;代码>声明所有堆栈操作,包括它们所属的“stack.h”中的
    push
    pop
    。我需要一个不使用前向声明的解决方案。我需要一个不使用前向声明或第三个文件的解决方案。如果没有这些解决方案,恐怕您无法解决问题。除非按照moldbnilo的建议,将push和pop移动到stack.h