我正在尝试理解然后使用其他人编写的代码,但由于我对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()
的返回类型时,我收到编译器错误:'RedundantTypedef'没有命名类型。通过正确使用::
范围解析可以解决此问题。而且我理解那部分。typedef std::map<std::string, StructName> RedundantTypedef;
移到HeaderTwoClass
之外时,我不必在typedef
中使用相同的header_one.h
我再次收到错误消息。错误:未在此范围内声明“RedundantTypedef” typedefs
的正确排列应该是什么,以便我没有错误,并且能够将其用作getTypedefedDataStructure()
SOLUTION:
我发现为什么出现了案例1的错误。我将typedef std::map<std::string, StructName> RedundantTypedef;
移到struct
声明之上,由于此typedef
本身包含struuct StructName
,编译器会报告错误。
感谢大家的帮助。我应该保留这个问题,还是应该删除它?
答案 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;或非唯一名称相互冲突。通过使用命名空间,它可以防止冲突,使生活变得非常简单