gpt4 book ai didi

c++ - 避开头文件 'pollution'

转载 作者:太空宇宙 更新时间:2023-11-04 11:41:11 25 4
gpt4 key购买 nike

好的,我有一个名为 Window 的类,它旨在满足将窗口组合在一起的所有要求,而且效果非常好。我唯一的问题是我包含 window.h 的任何文件也包含所有窗口。我已经将所有特定于 Windows 的元素设为私有(private),因此没有真正的理由让我的项目的其余部分需要了解这些元素,我宁愿知道我没有不小心使其他点点滴滴的窗口特定于意外。

我想出的唯一方法是创建包含这些元素的第二个类,并在第一个类中放置一个指向实例的指针。作为我正在谈论的示例,让我们从以下文件“ElementsIWantHidden.h”开始

#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 的方式。我需要 Windows 函数,我需要我的窗口类来使用它们,但我不想在我的 Windows 类之外不小心使用其中一些定义。

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

#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,并具有所有可用的 windows 函数和类型。

我能想出的唯一解决方法是使用代码创建类似文件“ClassWithHiddenElements.h”的内容:

#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 的过程中可能会耗尽内存,这意味着构造函数无法保证不抛出。其中一些不是大问题,因为还有许多其他因素通常会造成这些问题。有没有更好的方法来实现这个目标?我需要包含来自 windows.h 的类型的实例变量,但我不希望它污染项目的其余部分。

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

最佳答案

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

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 都放在该命名空间中。无论您将 typedef 放在哪里,您都应该为您的类创建一个命名空间。

关于c++ - 避开头文件 'pollution',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21360559/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com