Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;,我可以在生成器模式中使用默认构造函数吗?请检查我的问题和解决方案_C++_Design Patterns_Builder Pattern - Fatal编程技术网

C++ C++;,我可以在生成器模式中使用默认构造函数吗?请检查我的问题和解决方案

C++ C++;,我可以在生成器模式中使用默认构造函数吗?请检查我的问题和解决方案,c++,design-patterns,builder-pattern,C++,Design Patterns,Builder Pattern,这只是伪代码 我想将参数(=mail)复制到本地对象(=mEmail) 但我不能 如果我添加了默认构造函数(Email(){}),这个问题就解决了。但我不确定这是一个好的解决方案 您能给我一个更好的解决方案吗?您的EmailSender类包含一个名为mEmail的Email对象。这个mEmail对象当然需要初始化(构造) 问题是mEmail需要在EmailSender构造函数的主体运行之前构造,而编译器只能使用不存在的默认构造函数来默认构造它,从而导致错误 解决方案是在EmailSender构造

这只是伪代码

我想将参数(=mail)复制到本地对象(=mEmail)

但我不能

如果我添加了默认构造函数(Email(){}),这个问题就解决了。但我不确定这是一个好的解决方案


您能给我一个更好的解决方案吗?

您的
EmailSender
类包含一个名为
mEmail
Email
对象。这个
mEmail
对象当然需要初始化(构造)

问题是
mEmail
需要在
EmailSender
构造函数的主体运行之前构造,而编译器只能使用不存在的默认构造函数来默认构造它,从而导致错误

解决方案是在
EmailSender
构造函数初始值设定项列表中显式初始化(构造)
mEmail


你会犯什么错误?什么是
Aobject
?它包含哪些成员?请花点时间阅读,带上SO,阅读,以及。最后,请在你的问题中包括一个(强调最小部分)和一个复制粘贴(作为文本!),在你得到注释的代码中包含完整的错误。谢谢,但是如果EmailSender类是singleton,我认为你的解决方案不可用。EmailSender():mEmail(使电子邮件对象为空)这个怎么样?它正在工作。但我不确定这是否合理。“请让我知道你的意见。”森索拉玛说,“那么我觉得你的设计有问题。如果
EmailSender
应该是一个可以用来发送多封不同电子邮件的单一对象,那么它就不应该真正拥有自己的
mEmail
成员对象。相反,它应该有一个
Send
功能,它可以(引用)一封
电子邮件
对象。谢谢。实际上,目前我使用“struct Email{…};”来简单地解决这个问题。(如C数据结构)。但我希望用C++语言解决这个问题,设计好。
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);
        ...
    }
EmailSender(Email const& email)
    : mEmail{ email }  // Initialize (construct) using the copy-constructor
{
    // Empty body
}