由于嵌套,不能使用#include,不能使用类原型
Cannot #include due to nesting, cannot use class prototype
情况:我有一个Particle类和一个Field类。粒子有与之相关联的场,反之亦然。
我不能在"field.hpp"
中#include "particle.hpp"
,如果我在"particle.hpp"
中#include "field.hpp"
。当然,这很有意义。
我在两个文件中都使用了前向声明,但是编译器现在无法编译,并出现以下错误:
error: invalid use of incomplete type ‘class ElementaryParticle’
error: forward declaration of ‘class ElementaryParticle’
error: invalid use of incomplete type ‘class ElementaryField’
error: forward declaration of ‘class ElementaryField’
有解决这些问题的方法吗?我理解错误发生的原因。如何定义这两个类而不将它们包含在彼此的文件中?这些问题的出现是因为field试图访问particle的成员,而particle包含了一个由场组成的向量。
编辑:一个解决方法是将类合并为一个文件中的一个类…但这将是荒谬的,并导致各种各样的其他问题。
我会让field.hpp包含particle.hpp,在particle.hpp中包含一个ElementaryField的前向声明-然后在你的particle.cpp中包含field.hpp。只要在particle.hpp中没有任何代码,就可以解决问题。从技术上讲,您可以在.hpp文件中对每个文件进行前向声明,然后在.cpp文件中包含另一个文件的.hpp。这可能更好,因为它更标准化。我坚持了我最初的评估,因为你说场访问粒子的成员,而粒子只包含一个场的向量。
另外,如果你不使用pragma #一次,也许它会有所帮助?
大多数程序员在定义头文件时使用include保护符。有些编译器允许
#pragma once
指令,但是如果没有的话,一般的惯例是像这样定义#ifndef:
#ifndef PARTICLE_HPP__
#define PARTICLE_HPP__
class Field;
class Particle {
// ...
};
#endif // PARTICLE_HPP__
和
#ifndef FIELD_HPP__
#define FIELD_HPP__
class Particle;
class Field {
// ...
};
#endif // FIELD_HPP__
完成后,现在每个上下文中都有未定义类的问题。这里的解决方法是永远不要假设场中粒子的定义也不要假设场中粒子的定义。你有声明,这很好。但是不要使用任何需要定义的东西。例如,在Particle.hpp中,避免使用:
Field x; // Error: Requires Constructor definition
Field *y; // Okay
Field &z; // Okay, but must be initialized in constructor
y->foo(); // Error: Requires definition of foo
z.bar; // Error: Requires definition of bar
相反,把所有这些错误位放在你的.cpp中,它可以包括两个头,并有两个对象的完整定义。保持你的标题抽象,只有指针和引用,你应该没问题。
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么我的for循环不能正确获取argv
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 为什么我不能在 FOR LOOP 中使用 i/10,C++?
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 为什么模板类中的对象不能返回值
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- ld:bind_at_load和-bitcode_bundle(Xcode设置ENABLE_bitcode=YES)不能
- 数组长度,为什么从命令行获取时不能使用它?
- Windows/Cygwin - 不能使用 pybind11 - 犯错误
- 为什么我不能从同一目录中的另一个文件中 #include 我的类?
- 我不能在gloox中 #include < gloox/inbandbytestreammanager.h>
- 为什么我不能在 /usr/include 中安装 boost?
- 链接器不能识别某些#include
- 为什么我不能运行这个为什么这个c ++代码在Visual Studio中给出错误,尽管它在删除后在代码块中运行良好 #include "stdafx.h"
- c++文件不能使用特定的#include进行编译,而其他文件都可以
- 由于嵌套,不能使用#include,不能使用类原型
- 为什么我的#include文件不能编译