Typedef与另一类中的类

时间:2017-06-02 20:42:52

标签: c++ class oop typedef

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?

2 个答案:

答案 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。