c++ - 在多个源/头文件中使用 c++ 类时的头文件设置

标签 c++ class header

目前我有一个大类Policy,分别在名为globals.hglobals.cpp 的文件中声明和定义。除了 Policy 类之外,这些文件还包含其他几个使用 Policy 类的类和函数。由于编译时间问题,我现在想将 Policy 类与其他所有类分开。我希望在另一个源文件中定义所有其他类和所有使用 Policy 的函数,这样当我更改 Policy 类时,我不必重新编译所有其他类和函数。

但是,当我尝试将事物分开时,在尝试使用 Policy 类时遇到很多“字段类型不完整”错误。我相信它们是由于错误地使用了 #include 语句造成的。

下面我尝试以简单明了的方式模仿我的设置。请注意,还有许多其他源文件也 #include "globals.h"

globals.h:

#ifndef GLOBALS_H_
#define GLOBALS_H_

class Policy;

class A {
    A(std::vector<Policy>);
};

class Policy {

    // many member objects and functions declared
};

void func1(Policy&);
void func2(Policy&);

#endif

globals.cpp:

#include "globals.h"

A::A(std:vector<Policy> p) {
    // do stuff
}

//
// Define all of Policy's member functions
//

void func1(Policy& p) {
    // do stuff
}

void func2(Policy& p) {
    // do stuff
}

那么,现在我将开始讨论我的具体(虽然是开放式且可能含糊不清的)问题......

问题:鉴于我最初具有上述设置,并且当我尝试将上述内容拆分为 policy.cpppolicy 时。 hother.cppother.h,我遇到了很多“field has incomplete type”的错误,我可能犯了什么样的错误?


我希望对这个问题的回答将帮助我确定在我再次尝试拆分我的代码之前可以仔细研究的问题。 进行更改并遇到错误后,我放弃并恢复到上述原始设置。然而,后来我决定重新考虑并重新尝试将内容拆分为多个源文件。因此,我没有可以分享的具体问题代码。

最佳答案

确保包含 <vector>在包括其他包含 std::vector<Something> 的 header 之前.例如,在 globals.cpp添加 #include <vector>之前#include "globals.h" .

此外,您不能使用前向声明的结构/类类型,例如 Policy来自 globals.h在需要知道其大小的类型中(如 std::vector<Policy> )。 std::vector<*Policy>虽然会工作。

关于c++ - 在多个源/头文件中使用 c++ 类时的头文件设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17354335/

相关文章:

c++ - Boost.Coroutine 和 Boost.Coroutine2 的区别

c++ - 如果树的根改变了怎么办?

未调用 C++ 默认构造函数

header - 如果响应 header 包含内容类型,Content-Type 元标记是否重要?

c++ - C++ 中的枚举映射

c++ - 如何从Matlab调用具有多个输出的C++函数?

javascript - 如何使用 jQuery 在 JavaScript 中获取基于类的对象?

java - 构造与文件规范相关的 Java 哈希表的最有效方法是什么

javascript - DIV 等效 HTML5

c++ - 在哪里/如何定义模板