键入一个类型和相同类型的指针的正确方法是什么?
键入一个类型和相同类型的指针的正确方法是什么? 这就是我的意思。 我应该这样做:
typedef unsigned int delay; typedef unsigned int * delayp;
或者我应该这样做:
typedef unsigned int delay; typedef delay * delayp;
或者也许我根本不应该delayp
指针而只是使用delay *
而不是在我认为必要的任何地方delayp
?
谢谢,Boda Cydo。
正确的方法是不要这样做。 隐藏某事物是指针这一事实通常被视为糟糕的风格。
typedef unsigned int delay,* delayp;
typedef
ing原始指针类型是没有意义的(哈!)。 它不提供任何真正的抽象(消费者仍然必须理解类型是指针,并且他们必须弄清楚如何解析用于typename的任何命名约定以确定指针类型是什么)。
这也是糟糕的forms,因为如果你有:
typedef T* T_ptr;
然后const T* foo
和const T_ptr bar
是两个非常不同的东西。 ( foo
是一个指向const T
的指针;它是一个不通过该指针改变指针的承诺.bar是一个本身是const
的指针;它不能被改为指向别的东西。)
第一种情况(指向const
指针)很重要:它有助于强制执行函数契约。
第二种情况非常有用。
因此,如果要为指针类型添加typedef
,为了有用,您需要创建两个:
typedef T* T_ptr; typedef const T* const_T_ptr;
当你有智能指针类时,C ++中有一个可容忍的exception。 在这些情况下,输入boost::shared_ptr
可能会非常繁琐,因为为它创建一个typedef
是一个合理的便利。
通常,您执行第二个块,因为您正在重新使用该类型。 例如,如果delay
需要成为unsigned long
,则不需要修改delayp
的定义。
也就是说,隐藏在typedef
背后的指针通常是一个非常糟糕的主意。 对于像指针一样的东西,比如迭代器或智能指针,它更容易被接受:
typedef std::vector my_container; typedef my_container::iterator my_iterator; typedef some_type my_type; typedef shared_ptr my_shared_ptr;
在int
情况下它不应该有任何区别,但是在聚合类型的情况下,后一种方法更好,因为在前一种情况下*delay
不等于delayp
,并且需要使用cast来交替使用它们。
但正如其他人所说,你最好只是delay
。
你的第二个表格
typedef delay * delayp;
更好的是因为如果您将来希望将“delay”typedef从int更改为其他内容(例如,long),则只能在一个地方进行此更改。
如果你想让自己(将来)迁移到某种智能指针而不是原始指针(如果使用指针typedef,你的代码将保持几乎相同),隐藏指针可能很有用。否则,隐藏指针是不可用的。