C++ C+中的双向关联+;

C++ C+中的双向关联+;,c++,C++,我一直在尝试定义两个类 class state03: public state { public: std::string name; state03(bool inAcceptState, bool inRejectState) { setRejectState(inRejectState); setAcceptState(inAcceptState); name="State 03"; } sta

我一直在尝试定义两个类

class state03: public state
{
public:
    std::string name;   
    state03(bool inAcceptState, bool inRejectState)
    {
        setRejectState(inRejectState);
        setAcceptState(inAcceptState);
        name="State 03";
    }

    state * evalNextState(char input)
    {
         if(input==' ')
        {
            return this;
        }
         if(isalpha(input) || input=='_')
         {
             return new state04(false,false);
         }
        return new RejectState();
    }
};

class state04: public state
{
public:
    std::string name;
    state04(bool inAcceptState, bool inRejectState)
    {
        setRejectState(inRejectState);
        setAcceptState(inAcceptState);
        name="State 04";
    }
    state * evalNextState(char input)
    {
        if(isalnum(input) || input=='_')
        {
            return this;
        }
        if(input==',')
        {
            return new state03(false,false);
        }
        return new RejectState();
    }
};
由于编译器从上到下扫描代码,我收到了这个编译错误,类state04是未定义的,因为它是在类state03之后定义的


那么如何实现双向关系呢?

您应该将实现细节移动到一个单独的文件中,在这种情况下,这是最好、最简单的方法:

state03.h

class state03 : public state {
   // ...
   state * evalNextState(char input);
}
class state04 : public state {
   // ...
}
state04.h

class state03 : public state {
   // ...
   state * evalNextState(char input);
}
class state04 : public state {
   // ...
}
state03.cpp

#include "state03.h"
#include "state04.h"

state * state03::evalNextState(char input) {
    // your code here
}

您应该将实施细节移动到单独的文件中,在这种情况下,这是最好、最简单的方法:

state03.h

class state03 : public state {
   // ...
   state * evalNextState(char input);
}
class state04 : public state {
   // ...
}
state04.h

class state03 : public state {
   // ...
   state * evalNextState(char input);
}
class state04 : public state {
   // ...
}
state03.cpp

#include "state03.h"
#include "state04.h"

state * state03::evalNextState(char input) {
    // your code here
}

从类定义中取出实现并将其移动到实现文件。

从类定义中取出实现并将其移动到实现文件。

我尝试了正向声明,但由于我在实际定义类之前使用了类的构造函数,我收到另一个编译错误。user1043565:只需将声明与实现分开,这是正确的方法。我从答案中删除了forward声明,它实际上不适用于您的情况,因为您正在使用参数调用
state04
构造函数(我第一次错过了这个)。因此,尝试转发declare
state04
将导致不完整类型错误的无效使用。当我指定头文件的方法实现时,我收到此错误“this”:只能在非静态成员函数中引用。有什么想法吗?@user1043565:你能给问题添加更新的代码吗?如果操作正确,这种情况就不会发生。非常感谢您的支持,您是对的,我没有在方法定义中指定正在处理的类,这就是编译器将新方法视为静态块的原因。我尝试了前向声明,但由于我在实际定义它之前使用了类的构造函数,我收到另一个编译错误。user1043565:只需将声明与实现分开,这是正确的方法。我从答案中删除了forward声明,它实际上不适用于您的情况,因为您正在使用参数调用
state04
构造函数(我第一次错过了这个)。因此,尝试转发declare
state04
将导致不完整类型错误的无效使用。当我指定头文件的方法实现时,我收到此错误“this”:只能在非静态成员函数中引用。有什么想法吗?@user1043565:你能给问题添加更新的代码吗?如果操作正确,这种情况不应该发生。非常感谢您的支持,您是对的,我没有在方法定义中指定我正在处理的类,编译器将新方法视为静态块。