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

时间:2012-05-04 14:12:57

标签: c++ design-patterns c++11 fluent-interface unique-ptr

我正在使用fluent interface模式。

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

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

当然不起作用。

我该怎么做?做这样的事情有什么问题吗?

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

3 个答案:

答案 0 :(得分: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;
};

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

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

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

您错过了c++ fluent interface example 的一个重要思考:

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

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

但是如果你仍然想要返回一些内容,至少不要(误)使用unique_ptr,只返回一个新对象:

C create() { return C(); }