为什么这个对象没有检测到父亲class?
Why this object doesn't detect the father class?
我有以下 classes:
Automata
Class
#ifndef Automata_H
#define Automata_H
class Automata {
protected:
// ...
public:
virtual DFA* dfaEquivalent() {}
// ....
};
继承自Automata
的DFA
class
#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
我在继承方面犯了什么错误?
您在基础 class 中缺少前向声明(即在 Automata.h
中)header.
编译器当时并不知道DFA
是什么类型,它编译了Automata.h
header(即在Automata
的虚函数class)
virtual DFA* dfaEquivalent(){}
// ^^^^--> unknown type
因为它是指向类型 DFA
的指针,在 Automata.h
中为 DFA
提供前向声明 header 将解决问题。
#ifndef Automata_H
#define Automata_H
class DFA; // forward declaration
class Automata
{
public:
virtual DFA* dfaEquivalent() {}
// ...code
};
#endif
作为旁注,请看一下:When to use virtual destructors?。如果您将 child class object 存储为指向 Automata
.
的指针,您的 Automata
可能需要一个
我有以下 classes:
Automata
Class
#ifndef Automata_H
#define Automata_H
class Automata {
protected:
// ...
public:
virtual DFA* dfaEquivalent() {}
// ....
};
继承自Automata
的DFA
class
#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
我在继承方面犯了什么错误?
您在基础 class 中缺少前向声明(即在 Automata.h
中)header.
编译器当时并不知道DFA
是什么类型,它编译了Automata.h
header(即在Automata
的虚函数class)
virtual DFA* dfaEquivalent(){}
// ^^^^--> unknown type
因为它是指向类型 DFA
的指针,在 Automata.h
中为 DFA
提供前向声明 header 将解决问题。
#ifndef Automata_H
#define Automata_H
class DFA; // forward declaration
class Automata
{
public:
virtual DFA* dfaEquivalent() {}
// ...code
};
#endif
作为旁注,请看一下:When to use virtual destructors?。如果您将 child class object 存储为指向 Automata
.
Automata
可能需要一个