C ++, Могу ли я использовать конструктор по умолчанию в шаблоне построителя? Пожалуйста, проверьте мою проблему и мое решение - PullRequest
0 голосов
/ 07 апреля 2020
class Email
{
public:
  //Email(){} //If I added this, this problem is resolved. But I am not sure this is good solution.
  Email(EmailBuilder builder){
     ...
  }

  public class EmailBuilder {
     EmailBuilder() {...};
     EmailBuilder SetAddress(...) {...};
     EmailBuilder SetSubject(...) {...};
     EmailBuilder SetBody(...) {...};
     Email Build() {...};
  }
};  

class EmailSender
    {
    public:
       ...
       SendEmail(const Email& mail)
       {
           mEmail = mail;           }
    private:
       Email mEmail; //error : emailsender.h(8): error C2512: 'Email': no appropriate default constructor available
    }


    int main()
    {
        Email mail = new Email.Builder
                            .SetAddress("me@mail.com")
                            .SetSubject("C++ builders")
                            .SetBody("I like this API, don't you?")
                            .Build();
        ...
        EmailSender emailSender;
        ...
        emailSender.SendEmail(mail);
        ...
    }

Это просто псевдокод.

Я хочу скопировать параметр (= mail) в локальный объект (= mEmail).

Но я не могу этого сделать.

Если я добавил конструктор по умолчанию (Email () {}), эта проблема решена. Но я не уверен, что это хорошее решение.

Не могли бы вы дать мне более хорошее решение?

1 Ответ

0 голосов
/ 08 апреля 2020

Ваш класс EmailSender содержит объект Email с именем mEmail. Этот mEmail объект, конечно, должен быть инициализирован (создан).

Проблема заключается в том, что mEmail необходимо построить до тела конструктора EmailSender, и компилятор может конструировать его только по умолчанию, используя несуществующий конструктор по умолчанию, что приводит к вашей ошибке.

Решение состоит в том, чтобы явно инициализировать (конструировать) mEmail в списке инициализатора конструктора EmailSender :

EmailSender(Email const& email)
    : mEmail{ email }  // Initialize (construct) using the copy-constructor
{
    // Empty body
}
...