C++ typedef boost::共享\u ptr<;我的工作>;Ptr;或者#定义Ptr boost::shared#Ptr

C++ typedef boost::共享\u ptr<;我的工作>;Ptr;或者#定义Ptr boost::shared#Ptr,c++,boost,naming-conventions,shared-ptr,C++,Boost,Naming Conventions,Shared Ptr,我刚刚开始编写一个新的代码库,其中每个类都包含一个共享的\u ptr typedef(),如: 在一个常见标题中#define?然后你可以做: Ptr<MyClass> myClass(new MyClass); 并在每个类中保存Ptr定义。定义的缺点已在网络上广泛讨论。例如,它将与另一个命名空间中的Ptr冲突: someLibrary::Ptr somethingElse->someLibrary::crap 如果键入boost::shared_ptr真的很烦人,您可以使用名称空

我刚刚开始编写一个新的代码库,其中每个类都包含一个共享的\u ptr typedef(),如:

在一个常见标题中#define?然后你可以做:

Ptr<MyClass> myClass(new MyClass);

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

定义的缺点已在网络上广泛讨论。例如,它将与另一个命名空间中的Ptr冲突:

someLibrary::Ptr somethingElse->someLibrary::crap

如果键入boost::shared_ptr真的很烦人,您可以使用名称空间boost
。它将保持可读性(人们真的想知道它是boost shared_ptr)

我可以建议你做的另一件事是一系列的typedef。在我的公司,有一个惯例是MyClassPtr是一个用于boost::shared_ptr的typedef。

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

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

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

  • Ptr是一个boost共享的Ptr
  • ClassY::Ptr可以是另一个共享的\u Ptr
  • Ptr可以是一个简单的“Class Z*”指针
如果这些类随后在模板化代码中使用,则可以使用T::Ptr作为指向该类的指针类型,模板将使用最适合该类的指针

这是节省打字的唯一目的 boost::共享\u ptr

是的,差不多。嗯,不是为了节省打字本身,而是为了提高可读性。但我想这就是你的意思

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

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);
boost::shared_ptr func(boost::shared_ptr a,boost::shared_ptr b);
共享函数(共享函数a、共享函数b);
Ptr func(Ptr a、Ptr b);
Foo::ptr func(Foo::ptr a,Foo::ptr b);
FooPtr func(FooPtr a、FooPtr b);
Foo*func(Foo*a,Foo*b);

让类为Ptr定义自己的含义对我来说似乎很危险。e、 g.ClassZ::Ptr需要显式删除,而其他类型则不需要。客户端代码如何知道这一点?也许“ClassZ*”指针的情况是一个糟糕的例子,但该参数对于其他类型的智能指针仍然有效。我想举一个例子,是类本身决定指向它的最佳方式,而不是类的用户。这是一个不错的例子。您正在复制指针,因此只有一个副本的持有者必须执行
删除
。传统上是指拥有资源的人。将副本传递给其他人也没关系,但当然你最好确保只要他们打算使用该对象,该对象就会处于活动状态。我应该让我的问题更清楚地说明#define的问题(现在已经编辑该问题了)。我同意你的观点,使用名称空间boost似乎比节省键入更可取,我想知道为什么typedef Ptr习惯用法被普遍使用。一般来说,除非宏是绝对必要的,否则你应该避免使用它们,并且在需要时非常小心地命名它们。C++名称可以包含在类、函数或命名空间范围内,并且在不同上下文中使用相同名称时不会引起冲突。宏名称在每个范围内都会呕吐,并且可以以完全意想不到的方式无形地更改代码。当我看到boost::shared_ptr时,我完全知道它的作用。如果我在代码中看到Ptr,我必须查找它的含义,并且在不同的模块中有可能具有不同的含义(因为您的同事可能在他的代码中对其进行了不同的定义)。保持代码清晰,并使用全名。
Ptr<MyClass> myClass(new MyClass);
MyClass::Ptr myClass(new MyClass);
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);