我有以下类(class):Automata

#ifndef Automata_H
#define Automata_H

class Automata {

protected:
   // ...
public:
   virtual DFA* dfaEquivalent() {}
   // ....
};
DFA继承的Automata
#include "Automata.hpp"
#ifndef DFA_H
#define DFA_H

class DFA : public Automata
{
private:
public:
   DFA() {}
};
DFA继承的最后一个:
#include "DFA.hpp"

#ifndef _NFA_H
#define _NFA_H

class NFA : public DFA
{
private:
public:
   NFA() { }
   DFA* dfaEquivalent()
   {}
};
#endif
当我有一个NFA实例并想调用dfaEquivalent时,问题就来了,编译器说以下内容:
g++    -c -o main.o main.cpp
In file included from DFA.hpp:1:0,
                 from NFA.hpp:1,
                 from Comparador.hpp:5,
                 from main.cpp:2:
Automata.hpp:96:13: error: ‘DFA’ does not name a type; did you mean ‘DFA_H’?
     virtual DFA* dfaEquivalent(){}
             ^~~
             DFA_H
<builtin>: recipe for target 'main.o' failed
make: *** [main.o] Error 1
我在继承中犯了什么错误?

最佳答案

您在基类(即Automata.h中) header 中缺少前向声明。
编译器当时不知道DFA是什么类型,而是编译Automata.h header (即Automata类的虚函数中)

virtual DFA* dfaEquivalent(){}
//      ^^^^--> unknown type
由于它是指向DFA类型的指针,因此在DFA中提供Automata.h的前向声明,因此 header 将解决此问题。
#ifndef Automata_H
#define Automata_H

class DFA; // forward declaration

class Automata
{
public:
   virtual DFA* dfaEquivalent() {}
   // ...code
};
#endif

附带说明一下,看看:When to use virtual destructors?。如果将子类对象存储到Automata的指针,则Automata可能需要一个。

关于c++ - 为什么此对象未检测到父类?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/63557316/

10-12 18:12