我开始学习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();
};
答案 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和Expressione.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();
}