Паттерн Builder в С++

238
23 декабря 2017, 06:02

Здравствуйте, на языке Java построил вот такой шаблон Builder:

public class Account {
private String login;
private String password;
private Account() {
}
public String getLogin() {
    return login;
}
public String getPassword() {
    return password;
}
public static Builder newBuilder() {
    return new Account().new Builder();
}
public class Builder {
    private Builder() {
        // private constructor
    }
    public Builder setLogin(String login) {
        Account.this.login = login;
        return this;
    }
    public Builder setPassword(String password) {
        Account.this.password = password;
        return this;
    }
    public Account build() {
        return Account.this;
    }
}
}

Но не получается то же самое реализовать в С++, какие-то проблемы со статиками возникают, может кто поможет в этом или подскажет как? Или вообще кто-то скажет что это невозможно перенести на плюсы.

Answer 1

Моя телепатия говорит, что ваша проблема в том, что вы используете inner класс. В С++ inner классов нет. Вложенные классы ведут себя так же как Java-вские вложенные статические(nested). Пример:

//java
public class Account{
    public static class Builder{
    }
}
//c++
class Account{
public:
    class Builder{
    };
};

Попробуйте переписать ваш код так, чтобы Builder был nested, и тогда перевод на C++ станет немного проще.

Конечно без вашего кода на C++ это просто догадки. Но других потенциальных проблем я здесь не вижу.

Классический "Строитель" на C++:

#include <iostream>
#include <string>
class Account{
    std::string _login;
    std::string _password;
    Account(const std::string &login,
            const std::string &password):
        _login(login),
        _password(password)
    {}
public:
    class Builder {
        std::string _login;
        std::string _password;
    public:    
        Builder& setLogin(const std::string &login){
            _login = login;
            return *this;
        }
        Builder& setPassword(std::string password){
            _password = password;
            return *this;
        }
        Account* build(){
            return new Account(_login, _password);
        }
    };
    std::string login() const{
        return _login;
    }
    std::string password() const{
        return _password;
    }
};
int main(){
    Account *account = Account::Builder().setLogin("root").setPassword("123456").build();
    std::cout << account->login() << "\n";
    std::cout << account->password() << "\n";
}

http://cpp.sh/7yh7m

READ ALSO
Приведение void* к указателю на метод

Приведение void* к указателю на метод

Возникли трудности в процессе написания динамической библиотеки, содержащей реализацию методов классаБиблиотека подключается к главному...

216
Доступ из одного класса к полям другого

Доступ из одного класса к полям другого

ЗдравствуйтеПытаюсь реализовать примитивный tower defence

218
Способы создания обьектов класса С++

Способы создания обьектов класса С++

Сколькими способами можно создать обьект класса на С++ в ООП?

227
DirectX9, освещение текстурированной модели

DirectX9, освещение текстурированной модели

Все делаю по технологии: создаю буфер вершин, задаю координаты вершин, координаты текстуры, нормалиБез освещения модель отрисовывается идеально

211