3

我开始学习 C++(来自 Java),所以请耐心等待。

我似乎无法让我的方法声明接受我所做的课程。

“上下文”尚未声明

我想我不理解一个基本概念,但我不知道是什么。

表达式.h

#include "Context.h"  
class Expression {  
public:  
    void interpret(Context *);  // This line has the error
    Expression();  
    virtual ~Expression();  
};  

上下文.h

#include <stack>  
#include <vector>  
#include "Expression.h"  

class Context {  
private:  
    std::stack<Expression*,std::vector<Expression*> > theStack;  
public:  
    Context();  
    virtual ~Context();  
};
4

3 回答 3

6

您必须转发声明或反之亦然(或两者),否则您有循环依赖ExpressionContext例如,

表达式.h:

class Context; // no include, we only have Context*.

class Expression {  
public:  
    void interpret(Context *);  // This line has the error
    Expression();  
    virtual ~Expression();  
};

上下文.h:

#include <stack>  
#include <vector>  

class Expression; // No include, we only have Expression*

class Context {  
private:  
    std::stack<Expression*,std::vector<Expression*> > theStack;  
public:  
    Context();  
    virtual ~Context();  
};

您可以执行前向声明,因为不需要类的完整定义,因为在每种情况下您只引用指向另一个类的指针。您很可能需要实现文件中的包含(即#include "Context.h"inExpression.cpp#include Expression.hin Context.cpp)。

最后,记得在你的头文件中加入包含保护。

于 2013-01-28T21:29:50.740 回答
1

在 C++ 中,类定义总是必须以分号结尾,; 例如:

class foo {};

Java 和 C# 不需要,所以我可以看到你的困惑。

而且看起来你的两个头文件都包含彼此。因此,它有点像一条蛇在吃它的尾巴:它从哪里开始?因此,在您的 Expression.h 中,您可以用前向声明替换“包含”:

class Context;
class Expression {  
public:  
    void interpret(Context *);  // This line has the error
    Expression();  
    virtual ~Expression();  
}

最后但并非最不重要的一点是,您应该设置编译器保护以防止标头多次包含在 .cpp 文件中。您可以#pragma once在头文件的顶部放置一个。如果您使用的是 Visual Studio 和 microsoft 编译器,这将非常有用。我不知道 GCC 是否支持它。或者你可以像这样包装你的头文件:

#ifndef EXPRESSION_H_
#define EXPRESSION_H_
    class Context;
    class Expression {  
    public:  
        void interpret(Context *);  // This line has the error
        Expression();  
        virtual ~Expression();  
    }
#endif
于 2013-01-28T21:38:49.223 回答
0

您可能需要在 #include 之前的头文件中转发声明类 Context 和 Expression

例如

    #include <stack>  
    #include <vector>  

// forward declaration   
class Context;
    class Expression;

    #include "Expression.h"  

    class Context {  
    private:  
        std::stack<Expression*,std::vector<Expression*> > theStack;  
    public:  
        Context();  
        virtual ~Context();  
    }
于 2013-01-28T21:31:31.203 回答