代码之家  ›  专栏  ›  技术社区  ›  danio Kouga

typedef boost::shared_ptr<myjob>ptr;或定义ptr boost::shared_ptr

  •  2
  • danio Kouga  · 技术社区  · 14 年前

    我刚开始研究一个新的代码库,其中每个类都包含一个共享的ptr typedef( similar to this ):

    typedef boost::shared_ptr<MyClass> Ptr;
    

    唯一的目的是保存输入boost::shared_ptr吗?

    如果是这样的话,唯一不这样做的原因是

    #define Ptr boost::shared_ptr 
    

    在一个共同的标题中,定义的一般问题是什么?然后你可以做:

    Ptr<MyClass> myClass(new MyClass);
    

    只不过是打字而已

    MyClass::Ptr myClass(new MyClass);
    

    并在每个类中保存ptr定义。

    3 回复  |  直到 14 年前
        1
  •  9
  •   Patrick    14 年前

    宏(define)总是全局定义的。 这意味着每次使用“string”ptr(甚至是变量)都将被宏替换。

    typedef可以放在类中、命名空间中……所以你可以更好地控制它。

    编辑: 另一个优点是您可以在不同的类中拥有不同的ptr类型,例如

    • ClassX::ptr是一个增强共享指针
    • Classy::ptr可以是另一个共享的ptr
    • class z::ptr可以是一个简单的“class z*”指针

    如果这些类随后在模板化代码中使用,则可以使用t::ptr作为指向该类的指针类型,模板将使用最适合该类的指针。

        2
  •  2
  •   Pavel Radzivilovsky    14 年前

    定义的缺点已经在整个Web上被广泛讨论。例如,它将与另一个命名空间中的ptr冲突:

    someLibrary::Ptr somethingElse -> somelibrary::crap

    如果输入boost::shared\ptr真的很烦人,你可以 using namespace boost . 它将保持可读性(人们真的想知道它是BoostShared-ptr)。

    另一件事我可以建议你是一系列的typedef。在我的公司中,有一个约定,myClassptr是一个typedef,用于boost::shared_ptr。

        3
  •  2
  •   John    14 年前

    是保存键入内容的唯一目的 共享资源?

    是的,差不多。好吧,不是为了拯救 打字 从本质上说,这是为了改善 可读性 . 但我认为这就是你的意思。

    比较一下,看看你喜欢什么。除了注意宏和名称空间混乱的问题之外,没有正确的答案。

    boost::shared_ptr<Foo> func (boost::shared_ptr<Foo> a, boost::shared_ptr<Foo> b);
    
    shared_ptr<Foo> func (shared_ptr<Foo> a, shared_ptr<Foo> b);
    
    Ptr<Foo> func (Ptr<Foo> a, Ptr<Foo> b);
    
    Foo::ptr func (Foo::ptr a, Foo::ptr b);
    
    FooPtr func (FooPtr a, FooPtr b);
    
    Foo* func (Foo* a, Foo* b);