C++,我可以在构建器模式中使用默认构造函数吗?请检查我的问题和我的解决方案
C++, Can I use default constructor in builder pattern? Please check my problem and my solution
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(){}),这个问题就解决了。但我不确定这是不是好的解决方案。
你能给我更多好的解决方案吗?
您的 EmailSender
class 包含一个名为 mEmail
的 Email
对象。这个mEmail
对象当然需要初始化(构造)。
问题是mEmail
需要在之前构造EmailSender
构造函数的主体运行,编译器只能默认构造它使用不存在的默认构造函数,导致你的错误。
解决方法是在EmailSender
构造函数初始化列表:
中显式初始化(构造)mEmail
EmailSender(Email const& email)
: mEmail{ email } // Initialize (construct) using the copy-constructor
{
// Empty body
}
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(){}),这个问题就解决了。但我不确定这是不是好的解决方案。
你能给我更多好的解决方案吗?
您的 EmailSender
class 包含一个名为 mEmail
的 Email
对象。这个mEmail
对象当然需要初始化(构造)。
问题是mEmail
需要在之前构造EmailSender
构造函数的主体运行,编译器只能默认构造它使用不存在的默认构造函数,导致你的错误。
解决方法是在EmailSender
构造函数初始化列表:
mEmail
EmailSender(Email const& email)
: mEmail{ email } // Initialize (construct) using the copy-constructor
{
// Empty body
}