从静态成员函数

时间:2015-06-06 18:08:56

标签: builder

我正在尝试为我的类(C ++)创建一个Builder(设计模式)。 我有一个名为BookBuilder :: start()的函数,它被定义为静态函数,它返回一个BookBuilder

    BookBuilder BookBuilder::start()
     {
         mybook = new Book;
         return *this;
     }

但我无法编译代码,因为静态成员函数无法访问this指针。如果我无法访问BookBuilder,我该怎么办?构建器的最终用法如下所示:

Author* markTwain = new Author("Mark Twain", "twain@google.com", MALE);
Book* tomSawyer = BookBuilder::start()
            .withTitle("The Adventures of Tom Sawyer")
            .publishedBy("American Publishing Company")
            .writtenBy(*markTwain)
            .genre("Adventure")
            .isbn(68934)
            .hasPrice(100.99)
        .allocate();

类BookBuilder的私有部分只包含一个变量,它是指向Book的指针。

 Book* mybook;

2 个答案:

答案 0 :(得分:0)

我认为你的意思是回归*mybook。你的第一行实例化了一个新的Book,大概是你应该从你的函数返回的东西。如果这是正确的,您还应该将函数的返回类型从BookBuilder更改为Book

this指针指的是当前实例,但static函数没有当前实例。 BookBuilder::start是在类本身上定义的,并且在不引用BookBuilder的任何特定实例的情况下运行。

答案 1 :(得分:0)

只需返回一个新构造的对象:

BookBuilder BookBuilder::start()
 {
     return new BookBuilder();
 }

但你的功能很奇怪。在构建器模式中,您可以在build()方法中构造所需的实例。之前您只需提供构造最终对象所需的元素。见简单示例:

class BookBuilder {

    private String title; 

    private BookBuilder() {
    }

    public static BookBuilder start() {
        return new BookBuilder();
    }

    public BookBuilder withTitle(final String title) {
        this.title = title;
        return this;
    }

    public Book allocate() {
        return new Book(title);
    }
}

此代码是用Java编写的。将它转换为C ++应该很容易。