繁体   English   中英

对C ++头文件的基本了解

[英]A basic understanding of C++ header files

我有一个理论问题而不是错误报告。

我是一名新手C ++程序员,试图将其推广

使用VC ++ VS2008编译器

我经常发现自己想知道为什么我想在头文件中采取一些行动。

例如,看看这个代码块:

#include "DrawScene.h"
#include "Camera.h"
#include "Player.h"
#include "Grid.h"
#include "InputHandler.h"
#include "GameState.h"

class Controller
{
public:
private:
public:
 Controller();
 ~Controller(){}
 void Update();

private:
};

和连接CPP文件,controller.cpp一起

#include "stdafx.h"
#include "glut.h"
#include "Controller.h"
#include <iostream>

Grid* grid_ptr = new Grid();
InputHandler* inputHandler_ptr = new InputHandler();
DrawScene* drawScene_ptr = new DrawScene();
GameState* gameState_ptr = new GameState();

Controller::Controller()
{

}

void Controller::Update()
{

}

什么是决定哪些包括去哪里的好方法? 到目前为止,我一直在使用“无论如何工作”的方法,但我发现它有点不专业。

现在即使你可以说我的代码有X语法错误和设计缺陷,请这样做,但重点我会欣赏有关使用.h VS .cpp文件的信息。

为什么还有这样的设计呢? 在制作任何基于OOP的C ++程序时,总是会轻易踩着什么是陷阱和陷阱?

是什么引发了这个问题,因为我想通知读者头文件中存在控制器中存在的对象,但是如果不将它们静态分配这些未初始化的对象似乎是不可能的。

注意:我源于C# - > C ++,可能有助于了解。 这就是我对代码的看法。

提前谢谢您的努力!

编辑:26/08/2010 18:16

所以构建时间是良好包含的本质。 还有更多需要谨慎吗?

这是我的个人意见,而不是一致的最佳实践,但我建议的是:在头文件中,只包括使头文件内容编译而没有语法错误所必需的头文件 如果您可以使用前向声明而不是嵌套包含,请执行此操作。

原因是,在C ++中(与C#不同,iiuc)没有出口控制。 你包括从头部一切都会在头 includers,这可能是一大堆垃圾,你的界面的用户不应该看到的是可见的。

如果绝对必要,仅在另一个标题中包含标题。 如果标题只能在源文件中,那么这是最好的地方。 如果您只使用指针和对它们的引用,则可以在标头中使用类的前向声明。 您的DrawSceneGameStateGridInputHandler类看起来可能属于此类别。

请注意,C ++作为一种语言并不关心标头和源文件之间的区别。 这只是开发人员用来维护代码的极其常见的系统。 使用标头的明显优势是避免代码重复,并在某种程度上有助于为类,模板和内联函数强制执行单定义规则。

一般来说,标题应该驻留在cpp文件中。 对于标准库包括(可能包括第3个库),您可以将它们粘贴在标题中。 但是,为您的项目专门定义的标头应尽可能使用cpp文件。

原因是编译时间和依赖性问题。 每次更改头文件时,编译器都必须重新编译包含它的每个源文件。 当您在另一个头文件中包含头文件时,编译器必须重新编译包含头文件的每个cpp文件。

这就是前向声明和PIMPL(指向IMPLementation或不透明指针)模式很受欢迎的原因。 它允许您将至少一些更改/实现从头文件中移出。 例如:

// header file:
class SomeType;

class AnotherType
{
private:
    SomeType *m_pimpl;
};

不要求你包含“sometype.h”,而:

// header file
class AnotherType
{
private:
    SomeType m_impl;
};

确实。 编辑:实际上,如果你总是在包含“anothertype.h”的每个cpp文件中的“anothertype.h”之前包含“sometype.h”,则不需要在“anothertype.h”中包含“sometype.h”。

有时将头文件移动到cpp文件可能很困难。 那时你有一个决定 - 最好是通过抽象代码来完成这样做,或者只是添加包含更好吗?

避免在.h文件中放入太多(读取,任何不必要的) #includes 这样做会导致构建时间过长,例如,每当您更改Camera.h时,您都将更改Controller.h,因此需要重新构建包含Controller.h的任何内容。 即使它只是一个已经改变的评论。

如果只存储指针成员,则使用前向声明,然后将#includes添加到cpp文件中。

从理论上讲,.h文件只包含接口和.cpp文件,实现。 但是,由于私有成员可以说是实现,而不是接口,因此这并不严格,因此需要前向声明以尽量减少不必要的重建。

在C ++中,可以将整个实现内联包含在类定义文件中,就像使用Java一样,但这确实打破了.h / .cpp接口/实现规则。

头文件包含函数,类和其他对象的声明,而cpp文件用于实现这些先前声明的对象。

头文件主要由于历史原因而存在。 如果在实际调用代码之前给出了代码使用的所有函数,类等的定义,那么构建C ++编译器会更容易。

通常你使用cpp来实现。 在头文件中实现函数会自动内联它们,因此除非它们非常小和/或经常被调用,否则通常不是你想要的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM