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

时间:2014-10-23 16:29:39

标签: c++ pointers struct

我需要创建一个像堆栈一样的程序。 我正确地完成了所有功能。 问题是我在两个文件中有两个结构但是当我试图将指针放到另一个结构时它不会让我。

第一个结构在文件“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

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

#ifndef _MYSTACK_H
#define _MYSTACK_H
#include "linkedList.h"

struct myStack{
    int maxSize;
    int count;
    bool empty;
    elements* firstElement; //the problem is in this line*********************
};
typedef struct myStack myStack;

void initStack(myStack *s, int size);
void cleanStack(myStack *s);


bool isEmpty(myStack *s);
bool isFull(myStack *s);

#endif

但是当我尝试编译它时,它给了我这个错误:

  1. 错误C2143:语法错误:缺少';'在'*'之前。
  2. 错误C4430:缺少类型说明符 - 假定为int。注意:C ++不支持default-int
  3. 错误再次指向这行代码:

    elements* firstElement;
    

    如何解决此问题?

2 个答案:

答案 0 :(得分:2)

linkedList.h包含stack.h,stack.h包含linkedlists.h ....你不能这样做。然后,您的#ifndef _LINKEDLIST_H / #define _LINKEDLIST_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

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

答案 1 :(得分:0)

如果使用C预处理器处理包含以下行的文件:

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

你会看到为什么#include来自“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

从预处理器的输出中可以看出,myStack未在该行之前声明:

void push(myStack *s, int element);

这解释了如果您尝试编译test.cc,编译器将报告错误的原因。

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

解决这个问题的方法:

  1. 不要在“stack.h”中的#include“stack.h”或“stack.h”中的“linkedList.h”
  2. 在两个文件中使用前向声明以使用该类型。
  3. 更新的文件:

    linkedList.h:

    #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
    

    stack.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
    

    更新,以回应OP的评论

    #include的定义之后,您可以在{linkedList.h“中elements”stack.h“并确保只在编译单元中#include”linkedList.h“ 。如果在#include“linkedList.h”之前#include只是“stack.h”或#include“stack.h”,则会遇到编译错误。

    以下是没有正向声明的更新文件,可以正常工作。

    stack.h:

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

    但是,如果您使用:

    test.cc:

    #include "stack.h"
    

    你会遇到编译错误。