为什么我
在foo.h中:
class Foo
{
}
void Bar(const Foo& foo);
它有效但是:
在foo.h中:
class Foo
{
}
bar.cpp中的
#include "foo.h"
void Bar(const Foo& foo);
不起作用(未知类型名称'Foo'是其确切的单词)?
我不知道我的问题是什么不具体而且前向声明不起作用他们只是创建一个错误'重复符号'所以我只是发布我正在使用的代码 在creatures.h中
#ifndef CREATURES_H_
#define CREATURES_H_
#include <string>
#include "textio.hpp"
class Creature {
private:
protected:
int statBlock[10];
public:
std::string name = "foo";
Creature ();
void ai(int);
};
class Dwarf : public Creature {
private:
public:
std::string name = "Dwarf";
Dwarf (int);
void defaultDwarfGen();
};
的main.cpp
#endif
#include "creatures.hpp"
#include "textio.hpp"
#include <iostream>
int main(int argc, char const *argv[]) {
Dwarf creature_1(0);
return 0;
}
textio.hpp:
#ifndef TEXTIO_H
#define TEXTIO_H
#include <iostream>
#include "creatures.hpp"
void challenge(const Creature& param);
#endif
答案 0 :(得分:0)
为了正确回答这个问题,你必须提供foo.h,foo.cpp, bar.h 和bar.cpp
简而言之: 要在foo.h中使用Bar,foo.h必须具有Bar的声明。 要在bar.h中使用Foo,bar.h必须具有Foo的声明。
要在foo.cpp中使用Bar,foo.h或foo.cpp必须具有Bar的声明。 要在bar.cpp中使用Foo,bar.h或bar.cpp必须具有Foo的声明。
当我说“必须声明”时,你可以#include合适的标题。
如果你想在Foo的Bar and Bar中使用Foo,那么你有一个循环引用。我们克服这个问题的方法是通过前瞻声明。
您可以在此处阅读有关前瞻性声明:https://isocpp.org/wiki/faq/misc-technical-issues#forward-decl
答案 1 :(得分:0)
您的问题是您在textio.hpp
中包含creatures.hpp
,因此第一次编译器看到函数void challenge(const Creature& param)
没有定义生物类。
当您在createures.hpp
textio.hpp
中加入CREATURES_H_
已经定义并绕过包含时
你可以修复它删除此包含或声明Creature类的正向定义