如何避免两个不同头文件中的 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()
...

这里有两个我不明白的基本问题:

  1. 当我将 RedundantTypedef 用于 getTypedefedDataStructure() 的 return 类型时,出现编译器错误:“RedundantTypedef”未命名类型。这个问题可以通过正确使用 :: 作用域解析来解决。我理解那部分。
  2. 当我将 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",或者会相互冲突的非唯一名称.通过使用名称空间,它可以防止冲突,使生活变得非常简单。