如何避免两个不同头文件中的 typedef 冗余?
How to avoid typedef redundancy in two different header files?
我试图理解并使用别人编写的代码,但由于我对 typedef
的经验很少,所以有时会感到困惑。
有两个不同的头文件,一个继承另一个,并且在两个文件上声明相同的typedef。
为什么会出现冗余,如何避免?
header_one.h:
#include "header_two.h"
....
typedef std::map<std::string, StructName> RedundantTypedef;
....
class HeaderOneClass....
header_two.h:
....
struct StructName...
class HeaderTwoClass
{
public:
typedef std::map<std::string, StructName> RedundantTypedef;
std::map<std::string, StructName> getTypedefedDataStructure()
...
这里有两个我不明白的基本问题:
- 当我将
RedundantTypedef
用于 getTypedefedDataStructure()
的 return 类型时,出现编译器错误:“RedundantTypedef”未命名类型。这个问题可以通过正确使用 ::
作用域解析来解决。我理解那部分。
- 当我将
typedef std::map<std::string, StructName> RedundantTypedef;
移到 HeaderTwoClass
之外以便不必在 header_one.h
中使用相同的 typedef
时,我再次遇到错误。错误:“RedundantTypedef”未在此范围内声明
typedefs
的正确排列应该是什么,这样我就不会出错,并且能够将它用作 getTypedefedDataStructure()
的 return 类型
解决方案:
我发现为什么会出现案例1的错误。我将 typedef std::map<std::string, StructName> RedundantTypedef;
移动到 struct
声明之上,由于此 typedef
本身包含 struuct StructName
,编译器会报告错误。
感谢大家的帮助。我应该保留这个问题,还是应该删除它?
避免名称冲突的最简单方法是在 header 页面范围内创建名称空间。这是我必须为期末考试创建的杂货店数据库的示例。
// 文件:store.h
// 存储购买的商品
#ifndef STOREITEM_H
#define STOREITEM_H
#include "getItem.h"
namespace groceryStore
{
class StoreItem
{
public:
StoreItem();
StoreItem(Buying product, int quantity);
Buying getId() const;
int getQuantity() const;
double getTotal() const;
void increaseQuantity();
bool operator == (StoreItem & o);
private:
int quantity;
Buying product;
};
}
#endif
我有 5 classes 使用 dArray 来存储、计算、获取、存储等。Each.h 文件或 class 文件有自己的命名空间,可以通过:: 运算符,例如
// PRE: Must be called
// POST: Will return the id
groceryStore::Buying groceryStore::StoreItem::getId() const
{
return product; // change to id
}
以上是获取产品ID的函数。通过让每个 class 都有自己的命名空间,我可以在整个程序中使用多个 getID() 函数,这些函数在 class 中获取它们的特定私有数据。我需要更改的只是根据 class 的命名空间的 groceryStore 命名空间。
使用命名空间是非常必要的,因为一个大型程序被分成多个团队,并且在这些团队中有通用名称,例如 "data"、"file",或者会相互冲突的非唯一名称.通过使用名称空间,它可以防止冲突,使生活变得非常简单。
我试图理解并使用别人编写的代码,但由于我对 typedef
的经验很少,所以有时会感到困惑。
有两个不同的头文件,一个继承另一个,并且在两个文件上声明相同的typedef。
为什么会出现冗余,如何避免?
header_one.h:
#include "header_two.h"
....
typedef std::map<std::string, StructName> RedundantTypedef;
....
class HeaderOneClass....
header_two.h:
....
struct StructName...
class HeaderTwoClass
{
public:
typedef std::map<std::string, StructName> RedundantTypedef;
std::map<std::string, StructName> getTypedefedDataStructure()
...
这里有两个我不明白的基本问题:
- 当我将
RedundantTypedef
用于getTypedefedDataStructure()
的 return 类型时,出现编译器错误:“RedundantTypedef”未命名类型。这个问题可以通过正确使用::
作用域解析来解决。我理解那部分。 - 当我将
typedef std::map<std::string, StructName> RedundantTypedef;
移到HeaderTwoClass
之外以便不必在header_one.h
中使用相同的typedef
时,我再次遇到错误。错误:“RedundantTypedef”未在此范围内声明
typedefs
的正确排列应该是什么,这样我就不会出错,并且能够将它用作 getTypedefedDataStructure()
解决方案:
我发现为什么会出现案例1的错误。我将 typedef std::map<std::string, StructName> RedundantTypedef;
移动到 struct
声明之上,由于此 typedef
本身包含 struuct StructName
,编译器会报告错误。
感谢大家的帮助。我应该保留这个问题,还是应该删除它?
避免名称冲突的最简单方法是在 header 页面范围内创建名称空间。这是我必须为期末考试创建的杂货店数据库的示例。
// 文件:store.h // 存储购买的商品
#ifndef STOREITEM_H
#define STOREITEM_H
#include "getItem.h"
namespace groceryStore
{
class StoreItem
{
public:
StoreItem();
StoreItem(Buying product, int quantity);
Buying getId() const;
int getQuantity() const;
double getTotal() const;
void increaseQuantity();
bool operator == (StoreItem & o);
private:
int quantity;
Buying product;
};
}
#endif
我有 5 classes 使用 dArray 来存储、计算、获取、存储等。Each.h 文件或 class 文件有自己的命名空间,可以通过:: 运算符,例如
// PRE: Must be called
// POST: Will return the id
groceryStore::Buying groceryStore::StoreItem::getId() const
{
return product; // change to id
}
以上是获取产品ID的函数。通过让每个 class 都有自己的命名空间,我可以在整个程序中使用多个 getID() 函数,这些函数在 class 中获取它们的特定私有数据。我需要更改的只是根据 class 的命名空间的 groceryStore 命名空间。
使用命名空间是非常必要的,因为一个大型程序被分成多个团队,并且在这些团队中有通用名称,例如 "data"、"file",或者会相互冲突的非唯一名称.通过使用名称空间,它可以防止冲突,使生活变得非常简单。