繁体   English   中英

通过不可复制的课程

[英]Passing a noncopyable class

我正在读一本书,而作者有一个不可复制的类,该类最终成为另一个类的成员变量。 它对我很重要,这是因为作者的方式以及他偏爱引用的指针。 让我举个例子吧。

class Foo;         // noncopyable
class WrapperFoo
{
public:
    explicit    WrapperFoo(Foo& x)
                : mFoo(&x)
                {}

    Foo*    mFoo;
};

作者所做的让我感到惊讶的是,他通过引用传递了Foo对象,然后他获取Foo对象的地址并构造了mFoo指针。 为什么要以引用开头并以指针结尾?

class Foo;         // noncopyable
class WrapperFoo
{
public:

    explicit    WrapperFoo(Integer* x)
                : mFoo(x)
                {}

    Integer*    mFoo;
};

如果我想要一个指针,这似乎更简单(并且完全相同)。 我确实知道这可能只是偏爱。

class Foo;         // noncopyable
class WrapperFoo
{
public:
    explicit    WrapperFoo(Integer& x)
                : mFoo(x)
                {}

    Integer&    mFoo;
};

此外,我读过更喜欢对指针的引用,那么为什么不这样做呢?

我相信这三个示例可以完成相同的任务。 我想念什么吗? 为什么在此示例中作者可能更喜欢引用的指针? 最后,此用法是否有名称?

传递引用可防止您将NULL指针传递给构造函数。 它保证对象在创建过程中存在。

将引用作为数据成员通常很令人不快,因为必须在初始化列表中对其进行初始化(在对象创建时,这会产生一些影响,例如类型不可分配)。 通常只保留一个指针是一个更好的主意-尽管如果它是一个拥有的指针,那么不妨使用std :: shared_ptr或std :: unique_ptr。

至于为什么使用引用引用,然后使用地址,那是为了避免将引用作为数据成员,并使调用接口保持简单(以便可以使用arg代替&arg。)

我对作者意图的猜测是,使用引用而不是指针意味着我们可以在对象创建时保证地址包含有效对象。 指针的存储使对象可复制,并且在需要时可重新绑定。

尽管没有一种方法可以保证在创建对象之后传递的对象仍然有效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM