在另一堂课中带有类Typedef

Typedef With A Class In Another Class

本文关键字:Typedef      更新时间:2023-10-16
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?

似乎A类是B类的成员

否。您拥有的是 name (在这种情况下是一种类型(,在class B中声明为classA,它是类的类型,A。在C 中,类的名称也是一个名称空间。因此,Typedef,让您访问class B中的名称classA

我以前从未见过这样的东西。

在您的特定示例中,这可能是过度的。但是拥有类型的别名非常有用,您会发现很多类模板代码。

考虑:

template<typename T>
class B{
  public:
    typedef T classA;
};

没有上面的typedef,很难分辨出上述类型的类型。

一个典型的示例是STL算法如何通过通过std::iterator_traits

访问迭代器类型的名称iterator_category来告诉给定迭代器的类别

类定义class B { typedef A classA; }不能在类B中定义任何数据成员;使用typedef,它引入了一个新名称classA作为类型class A的同义词(。因为此Typedef名称是在class B中定义的,所以它在B类的名称空间中,因此您需要将此新类型称为B::classA,然后将其等同于A。例如,C 标准:

7.1.3 typedef指定

(1(包含dect-secifier typedef的声明声明声明标识符,以后可用于命名。... 因此,Typedef名称是另一种类型的同义词。 ...

btw:引入别名的一种常见方法也是 using-陈述:

using classA = A;

(2(typedef-name也可以通过别名 - 陈述引入。这 遵循使用关键字的标识符变为typedef-name,并且 遵循标识符的可选属性特定符号 对于这个Typedef-name。它具有相同的语义 由Typedef规范介绍。特别是,它没有定义 一种新类型,它不得出现在类型ID中。