如何在两个不同的头文件中避免typedef冗余?

时间:2015-01-25 00:15:49

标签: c++ c++11 typedef

我正在尝试理解然后使用其他人编写的代码,但由于我对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()的返回类型时,我收到编译器错误:'RedundantTypedef'没有命名类型。通过正确使用::范围解析可以解决此问题。而且我理解那部分。
  2. 当我将typedef std::map<std::string, StructName> RedundantTypedef;移到HeaderTwoClass之外时,我不必在typedef中使用相同的header_one.h我再次收到错误消息。错误:未在此范围内声明“RedundantTypedef”
  3. typedefs的正确排列应该是什么,以便我没有错误,并且能够将其用作getTypedefedDataStructure()

    的返回类型

    SOLUTION:

    我发现为什么出现了案例1的错误。我将typedef std::map<std::string, StructName> RedundantTypedef;移到struct声明之上,由于此typedef本身包含struuct StructName,编译器会报告错误。

    感谢大家的帮助。我应该保留这个问题,还是应该删除它?

1 个答案:

答案 0 :(得分:0)

避免名称冲突的最简单方法是在标题页范围内创建名称空间。这是我必须为决赛创建的杂货店数据库的一个例子。

//文件: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个类使用dArray来存储商店,计算,获取,存储等。Each.h文件或类文件有自己的命名空间,可通过::运算符访问,如

// PRE: Must be called
// POST: Will return the id
groceryStore::Buying groceryStore::StoreItem::getId() const
{
    return product; // change to id
}

以上是获取产品ID的功能。让每个类都有自己的命名空间,我可以在整个程序中有多个getID()函数,这些函数在类中获取它们的特定私有数据。我必须改变的是名称空间,它是关于类的命名空间的杂货店。

使用命名空间非常必要,因为大型程序被分成团队,在这些团队中有通用名称,例如&#34;数据&#34;,&#34;文件&#34;或非唯一名称相互冲突。通过使用命名空间,它可以防止冲突,使生活变得非常简单