繁体   English   中英

流畅的界面模式和std :: unique_ptr

[英]Fluent interface pattern and std::unique_ptr

我正在使用流畅的界面模式。

首先,我写了类似的东西:

class C
{
public:
    C() { }

    C* inParam1(int arg1){ param1 = arg1; return this; }
    C* inParam2(int arg2){ param2 = arg2; return this; }

private:
    int param1;
    int param2;
}

然后我尝试使用std :: unique_ptr,但后来我意识到我不知道如何沿着链“移动”指针(this)。 我尝试过类似的东西:

return std::move(this);

那当然不行。

我怎样才能做到这一点? 做这样的事有什么问题吗?

为了回复如下评论:“不要使用指针”:没有(还)任何实际原因,因为我用指针做这个,只是我想知道是否可以这样做。

为什么你必须返回指针?

class C
{
public:
    C create() { return C(); }

    C & inParam1(int arg1){ param1 = arg1; return *this; }
    C & inParam2(int arg2){ param2 = arg2; return *this; }

private:
    C() { }
    int param1;
    int param2;
};

我必须承认我不理解该创建函数的目的或者为什么构造函数是私有的或者你实际上如何创建这个类的对象。 根据我的理解,该课程应该是这样的:

class C
{
public:
    C() {}

    C & inParam1(int arg1){ param1 = arg1; return *this; }
    C & inParam2(int arg2){ param2 = arg2; return *this; }

private:        
    int param1;
    int param2;
};

像这样使用:

int main()
{
    C().inParam1(10).inParam2(20).whatever();
}

对于任何给定的实例,只能有一个std::unique_ptr实例(因为每个实例都会尝试删除它,并且只能执行一次)。 因此,虽然create可以返回std::unique_ptr ,但其他两种方法都不能。

有没有理由为什么你没有其他方法返回引用而不是指针? 你为什么不只是一个公共构造函数? 我在这个例子中没有看到create方法的值。

您从c ++流畅的界面示例中错过了一个重要的想法:

//it doesn't make sense to chain after create(), so don't return *this

因此,您不应该从create()方法返回任何内容。

但是如果你还想要返回一些东西,至少不要(误)使用unique_ptr ,只返回一个新对象:

C create() { return C(); }

暂无
暂无

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

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