使用另一个类的C ++方法声明

时间:2013-01-28 21:28:31

标签: c++ class header

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

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

  

'上下文'尚未宣布

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

Expression.h

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

Context.h

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

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

3 个答案:

答案 0 :(得分:6)

您必须在Expression中转发声明Context,反之亦然(或两者),否则您将拥有循环依赖关系。例如,

Expression.h:

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

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

Context.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"中的Expression.cpp#include Expression.h中的Context.cpp

最后,请记住将include guards放在头文件中。

答案 1 :(得分:1)

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

class foo {};

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

此外,您的头文件看起来都互相包含。因此它有点像蛇吃它的尾巴:它从哪里开始?因此,在Expression.h中,您可以使用前向声明替换“include”:

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

答案 2 :(得分:0)

您可能需要在#include

之前在头文件中声明类Context和Expression

e.g。

    #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();  
    }