0

我有一个用于自动机的许多状态的通用类。它声明如下:

#ifndef STATE_H_
#define STATE_H_
#include "Automat.h"

class State {
public:
virtual void readChar(char c, Automat* automat) = 0;
virtual ~State(){};
};

#endif /* STATE_H_ */

我在eclipse中得到这个错误:

此行有多个标记

  • 没有已知的参数 2 从 'Automat* const' 到 'int*' 的转换</li>
  • 虚空状态::readChar(char, int*)
  • 'Automat' 尚未声明

我的自动机如下:

    #ifndef Automat_H_
    #define Automat_H_
    #include "../../Scanner/src/IScanner.h"
    #include "./States/State.h"

    class Automat {
    public:
        int count;
        State* current;
        IScanner* scanner;
        Automat(IScanner *s);
        void readChar(char c);
        void setState(State *s);
        void error();
        ~Automat();
    };

    #endif /* Automat_H_ */

最后是 Automat 的实现,我将省略一些方法。

#include "Automat.h"
#include "./States/StartState.h"


Automat::Automat(IScanner *s) {
    current = StartState::makeStartState();
    scanner = s;
    count = 0;
}

void Automat::readChar(char c) {
    current->readChar(c, this);
}

我不知道是什么原因造成的。我需要在接口中声明东西吗?为什么要转换参数?

谢谢大家。

4

2 回答 2

6

两个标题都试图相互包含,这是不可能的。

幸运的是,两个类定义都不需要另一个类的完整定义。每个只处理指向另一个的指针,只需要一个声明。所以更换

#include "Automat.h"

class Automat;

同样对于State.

于 2013-11-07T09:58:32.893 回答
-1

IMO,我会在主文件中做预处理器的东西,并在每个头文件中定义一个变量,所以你知道它只包含一次。如果给定,您也可以在“StdAfx.h”中执行此操作。

这只是一个标题混乱,请确保只包含一次。#pragma once也可能有帮助。

于 2013-11-07T11:02:24.020 回答