class A{
public:
A(){ letter = 66; }
void display(void){ cout << "A = " << letter; }
private:
int letter;
};
class B{
public:
typedef A classA;
};
int main(void){
B::classA objA;
objA.display();
return 0;
}
此代码运行正常;但是,我无法理解我们在此代码中执行的操作。 我以前从未见过这样的东西。似乎A类是B类的成员。如果是这样,为什么我们不通过B类对象使用classA?
答案 0 :(得分:1)
似乎A类是B类的成员。如果是这样,为什么我们不通过B类对象使用classA?
没有。你所拥有的是名称(在这种情况下是一种类型)在class B
中声明为classA
,它作为类A
的typedef。在C ++中,类的名称也是名称空间。所以typedef允许您访问classA
中的名称class B
。
我以前从未见过这样的事情。
对于您的具体示例,它可能是一种矫枉过正。但是拥有类型别名非常有用,你会在许多类模板代码中找到它。
考虑:
template<typename T>
class B{
public:
typedef T classA;
};
如果没有上面的typedef
,就很难说出上面的类被实例化的类型。
一个典型的例子是STL算法如何通过std::iterator_traits
iterator_category
来告诉给定迭代器的类别
答案 1 :(得分:1)
类定义class B { typedef A classA; }
未定义类B
中的任何数据成员;使用typedef
,它引入了一个新名称classA
作为类型class A
的同义词。因为此typedef-name是在class B
中定义的,所以它位于类B
的命名空间中,因此您需要将此新类型称为B::classA
,这等同于{ {1}}。例如,提供C++ standard:
7.1.3 typedef说明符
(1)包含decl-specifier typedef的声明声明了稍后可用于命名的标识符。 ... 因此,typedef-name是另一种类型的同义词。 ...
BTW:引入别名的常用方法还有A
- 声明:
using
(2)也可以通过别名声明引入typedef-name。该 using关键字后面的标识符变为typedef-name和 标识符appertains后面的可选attribute-specifier-seq 到那个typedef-name。它具有与它相同的语义 由typedef说明符引入。特别是,它没有定义 一个新类型,它不应出现在type-id。
中