首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >避免头文件“污染”

避免头文件“污染”
EN

Stack Overflow用户
提问于 2014-01-26 14:39:55
回答 1查看 842关注 0票数 1

好的,我有一个名为Window的类,它被设计用来处理组装窗口的所有需求,它工作得非常好。我唯一的问题是,我在window.h中包含的任何文件也会包含所有的窗口。我已经将所有特定于windows的元素设置为私有的,所以没有真正的理由让我的项目的其余部分需要知道这些元素,而且我更愿意毫无疑问地知道,我没有意外地将其他一些特定于windows的元素设置为特定于windows的元素。

我能想到的唯一方法是创建包含这些元素的第二个类,并在第一个类中放置一个指向实例的指针。对于我正在讨论的示例,让我们从下面的文件"ElementsIWantHidden.h“开始。

代码语言:javascript
复制
#ifndef ELEMENTS_I_WANT_HIDDEN_H
#define ELEMENTS_I_WANT_HIDDEN_H

typedef short int16;
typedef int int32;
typedef long long int64;

#endif

让我们假设这些定义带有一些其他函数,类似于windows.h定义WHND的方式。我需要窗口函数,我需要我的窗口类来使用它们,但我不想犯在我的窗口类之外意外使用其中一些定义的错误。

如果我有包含以下代码的文件"TraditionalClass.h“:

代码语言:javascript
复制
#ifndef TRADITIONAL_CLASS_H
#define TRADITIONAL_CLASS_H

#include "ElementsIWantHidden.h"

class TraditionalClass
{
private:
    int16 shortInt;
    int32 mediumInt;
    int64 longInt;
public:
    TraditionalClass();
    void print();
};

#endif

然后,任何包含TraditionalClass.h的文件也包含windows.h,必须编译windows.h,并且拥有所有可用的窗口函数和类型。

我能想出的唯一解决办法是在代码中包含类似文件"ClassWithHiddenElements.h“的内容:

代码语言:javascript
复制
#ifndef CLASS_WITH_HIDDEN_ELEMENTS
#define CLASS_WITH_HIDDEN_ELEMENTS

class HiddenElementsContainer;

class ClassWithHiddenElements
{
private:
    HiddenElementsContainer* hiddenElementsContainer;
public:
    ClassWithHiddenElements();
    ~ClassWithHiddenElements();
    void print();
};

#endif

然后,ClassWithHiddenElements.cpp定义或包括一个定义HiddenElementsContainer的文件,并在构造函数中创建和实例,在析构函数中删除它。

这是可行的,包含ClassWithHiddenElements.h的类无法看到ElementsIWantHidden.h中定义的任何内容。问题是,使用这些类型的ClassWithHiddenElements成员必须隐藏在指针后面,这会减慢访问速度。ClassWithHiddenElements现在必须有复制构造函数、复制运算符和析构函数。当更多的内存被分配给创建ElementsIWantHidden的实例时,在构造ClassWithHiddenElements的过程中可能会耗尽内存,这意味着构造函数不能有一个不可抛出的guarentee。其中一些并不是什么大问题,因为有很多其他的东西经常会造成这些问题。然而,有没有更好的方法来实现这个目标呢?我需要包含windows.h中类型的实例变量,但我不希望它污染项目的其余部分。

仅供参考,这是为了游戏开发,我希望最终的产品是跨平台兼容的,这是我不希望windows.h的元素被意外使用在其他不应该是操作系统感知的文件中的很大一部分原因。

EN

回答 1

Stack Overflow用户

发布于 2014-01-26 15:11:34

使typedefs成为您的类的一部分:

代码语言:javascript
复制
class TraditionalClass
{
private: // can make them public also
    typedef short int16;
    typedef int int32;
    typedef long long int64;

private:
    int16 shortInt;
    int32 mediumInt;
    int64 longInt;
public:
    TraditionalClass();
    void print();
};

这样,在类内部,您可以简单地引用您的类型,而不需要任何限定名称。

从类的外部,如果它们是private,你根本不能访问它们。如果它们是public,那么您只能使用它们的限定名TraditionalClass::int16来访问它们。

另一种方法是创建一个名称空间,并将类和typedefs都放在该名称空间中。无论您将typedefs放在哪里,都应该为您的类创建一个命名空间。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21360559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档