2

我最近尝试学习如何使用std::shared_ptr. 在修改我现有的代码时,我发现自己在分配成员变量(在初始化列表之外)时感到困惑。

我的旧代码:

Class A {

Base* member_var;

A() {
    this->member_var = new Derived();
}

};

我的新代码:

Class A {

std::shared_ptr<Base> member_var;

A() {
    //Note the shared_ptr is given type Derived, matching the object.
    this->member_var = std::shared_ptr<Derived> (new Derived());
}

};

这个对吗?或者这可能更正确?:

Class A {

std::shared_ptr<Base> member_var;

A() {
    //Note the shared_ptr is of type Base, matching the member type.
    this->member_var = std::shared_ptr<Base> (new Derived());
}

};

这两种说法有什么区别。

令人担忧的是,我似乎找不到任何代码示例来说明我在这里尝试做的事情。我的使用方法是std::shared_ptr错误的吗?


编辑:感谢大家的帮助。我想我造成了一些混乱。为了将来的可读性,我将详细说明我选择采用这种方法的原因。我选择用一个简单的代码示例来说明我的问题。在我的实际问题中,我不使用 a Class A,我实际上使用的是结构。这个结构的唯一目的是帮助我巧妙地掌握各种不同对象的多个实例。我经常最终单独传递(通过引用)每个对象,而不是结构本身,作为函数的参数。此外,当我将整个结构作为参数时,我倾向于按值传递这个结构。因此,我有兴趣制作这些 shared_ptr,而不是 unique_ptr。我一直在争论改变一切并将所有这些封装在一个类中,比如Class A在我的示例中,并通过引用传递对象实例的所述类实例。在这种情况下,我同意所有评论过的人,并且unique_ptr似乎更合适。

当然,结构和类之间没有根本区别。我只是倾向于按值传递结构的实例(如果它们包含的只是指针),并通过引用传递类的实例。也许这是我个人的怪癖?

首先关于多态性的使用,这里有两个可能的派生类,其中一个是在运行时选择的。我希望处理用于所有意图和目的的基类,一个抽象类。

我仍然很惊讶这不是一个更常见的情况。也许上述段落突出了进一步的不良做法。在这种情况下,我将不胜感激。

4

1 回答 1

5

我会这样写:

A() : member_var(std::make_shared<Derived>()) { }

在现代 C++ 中,您应该尽可能避免使用new。如果您无法member_var在初始化列表中初始化您的,请执行以下操作:

A()
{
    // ...
    member_var = std::make_shared<Derived>();
}

正如 KerrekSB 在评论中提到的那样,我还建议考虑您是否确实需要共享所有权,或者 aunique_ptr是否不够。

如果是这种情况,您应该使用 aunique_ptr代替:通常,表达最低要求是一件好事 - 这可以同时为您购买性能和更好的自文档代码。

不幸的是,在 C++11 中,您必须求助于new创建一个unique_ptr指向新创建对象的对象:

A() : member_var(new Derived()) { }

或者,如果您不能使用初始化列表:

member_var.reset(new Derived());

另一方面,在提供 的 C++14 中std::make_unique<>,我宁愿写:

A() : member_var(std::make_unique<Derived>()) { }

或者,如果您不能使用初始化列表:

member_var = std::make_unique<Derived>();
于 2013-07-05T16:19:30.867 回答