typedef优于派生类的优点?

Mer*_*OWA 7 c++ templates forward-declaration

简单地说,说实话之间有什么(或有什么)差异

class MyClassList : list<MyClass> { };
Run Code Online (Sandbox Code Playgroud)

VS

typedef list<MyClass> MyClassList;
Run Code Online (Sandbox Code Playgroud)

我能想到的唯一优势(以及它引出我这个问题的原因)是,通过派生类,我现在可以轻松地将MyClassList声明为

class MyClassList;
Run Code Online (Sandbox Code Playgroud)

没有编译器错误,而不是

class MyClass;
typedef list<MyClass> MyClassList;
Run Code Online (Sandbox Code Playgroud)

我想不出任何差异,但这让我想知道,是否有一种类型的可以使用一个简单的派生类不能使用的类型?

换句话说,有什么理由不改变我所有的typedef列表<...> SomeClassList; 到简单的派生类,以便我可以轻松地转发声明它们?

Ton*_*ion 9

在C++中,不建议从STL容器派生,所以不要这样做.

A typedef只是为现有类型创建一个别名,因此typedef std::list<MyClass> MyClassList;创建了一个"新类型",MyClassList您现在可以使用它来调用,如下所示:

MyClassList lst;

将你的typedefs改为派生类是个坏主意.不要这样做.


Dou*_* T. 5

typedef完全用于此目的 - 别名类型名称.它非常惯用,不会混淆任何熟悉C++的人.

但要解决为什么继承可能是一个坏主意.

std::list没有虚拟析构函数.MyClassList通过基类删除时,含义不会被调用析构函数.所以这通常不赞成.在您的情况下,您无意将任何成员放在MyClassList中,因此在下一个程序员将​​继承视为添加新成员/覆盖函数等的邀请之前,这将成为一个没有实际意义的点.他们可能没有意识到std::list析构函数不是虚拟的,也没有意识到在某些情况下MyClassList析构函数不会被调用.


Jon*_*Jon 3

好吧,atypedef只能做它的名字所暗示的事情,而派生类可能是对其基类的全面改造。因此,虽然就编译器而言,如果您将自己限制为“仅”派生(而不添加任何成员,或覆盖任何内容等),则可能不会有太大差异,但就人类而言,可能会有很大差异代码的读者很关心。

人们可能想知道“为什么这是一个派生类,而 atypedef就足够了”?大多数人会认为一定有一个原因,所以你会让代码未来的维护者的生活变得更加困难。typedef另一方面,A是一个非常具体的工具,不会提出问题。

当我们谈论维护主题时,不要忘记,就像 C++ 中的大多数事情一样,“只要我们遵守纪律并且不跨越这条线,就不会出错”是对灾难的公开邀请。由于编译器不会阻止你,所以有一天,有人越界。