Здравствуйте, на языке 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;
}
}
}
Но не получается то же самое реализовать в С++, какие-то проблемы со статиками возникают, может кто поможет в этом или подскажет как? Или вообще кто-то скажет что это невозможно перенести на плюсы.
Моя телепатия говорит, что ваша проблема в том, что вы используете 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
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Возникли трудности в процессе написания динамической библиотеки, содержащей реализацию методов классаБиблиотека подключается к главному...
ЗдравствуйтеПытаюсь реализовать примитивный tower defence
Сколькими способами можно создать обьект класса на С++ в ООП?
Все делаю по технологии: создаю буфер вершин, задаю координаты вершин, координаты текстуры, нормалиБез освещения модель отрисовывается идеально