3

私は C++ (Java から来ている) を学び始めているので、我慢してください。

作成したクラスを受け入れるメソッド宣言を取得できないようです。

「コンテキスト」が宣言されていません

基本的な概念を理解していないと思いますが、何がわかりません。

式.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();  
};
4

3 に答える 3

6

またはその逆(またはその両方)を前方宣言するExpression必要があります。そうしないと、循環依存関係があります。Context例えば、

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

最後に、ヘッダー ファイルにインクルード ガードを配置することを忘れないでください。

于 2013-01-28T21:29:50.740 に答える
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ヘッダー ファイルの先頭にa を配置できます。これは、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 に答える