4

我正在玩流畅的界面模式。

首先,我写了这样的东西:

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);

那当然行不通。

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

为了回复诸如“不要使用指针”之类的评论:(还)没有任何实际原因,因为我正在使用指针进行此操作,只是我想知道是否可以这样做。

4

3 回答 3

10

为什么你必须返回指针?

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();
}
于 2012-05-04T14:18:18.130 回答
2

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

是否有任何理由不让其他方法返回引用而不是指针?为什么你不只是有一个公共构造函数?create在此示例中,我看不到该方法的价值。

于 2012-05-04T14:18:57.560 回答
1

您错过了c++ fluent interface 示例中的一个重要想法:

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

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

但是,如果您仍然想返回某些东西,至少不要(误)使用unique_ptr,而只需返回一个新对象:

C create() { return C(); }
于 2012-05-04T14:22:27.193 回答