C++ 如果对象没有默认构造函数,并且不允许我在其类定义中创建构造函数,那么如何将对象放入节点中?

C++ 如果对象没有默认构造函数,并且不允许我在其类定义中创建构造函数,那么如何将对象放入节点中?,c++,class,object,constructor,default,C++,Class,Object,Constructor,Default,我想马上指出,我已经搜索了这个网站,没有发现类似的问题。 有些人无法在节点中放置对象,但我的问题是: 我不能将对象放在节点内,也不允许为该对象创建默认构造函数(至少不在其类定义内) 更具体地说: 我被授予以下类别的雇主: class Employer { public: Employer(string x, int a, int b, int c); string getname() const { return name; } private: strin

我想马上指出,我已经搜索了这个网站,没有发现类似的问题。 有些人无法在节点中放置对象,但我的问题是:

我不能将对象放在节点内,也不允许为该对象创建默认构造函数(至少不在其类定义内)

更具体地说:

我被授予以下类别的雇主:

class Employer
{    
public:

    Employer(string x, int a, int b, int c);

    string getname() const { return name; }

private:
    string name;
    int age, sal, hire;
};

Employer::Employer(string x, int a, int b, int c) : name(x), age(a), sal(b), hire(c) { }
正如您所看到的,这个类没有默认构造函数,我不允许创建一个(这些是规则!)

我已经创建了以下类节点:

class Node
{
public:
    Employer emp;
    Node* link;
    Node(Employer);
};

Node::Node(Employer x)
{
    emp= x;
    link=NULL;
}
如您所见,我想创建一个节点类,其中包含一个节点指针和一个对象

不幸的是,这不起作用。我一直收到以下错误消息:

E2279:找不到初始化成员的默认构造函数

基本上,发生的情况是因为类Employer没有默认构造函数,“Employer emp;”在节点类中,编译器不会像它是“int n”而不是“Employer emp”那样“识别”

所以我的问题是:

如何在不更改/添加任何内容到类雇主的情况下将对象雇主放置在节点中(即我不能向类雇主添加默认构造函数,也不能添加“friend class Node”之类的内容,规则是我应该保持类雇主的原样)


由于我是编程新手,我想补充一点,我还没有学过模板,所以我不允许使用任何模板,只是我已经给你的工具(类、函数、指针等等)

为初始值设定项列表中的
雇主成员提供了显式的构造函数调用:

class Node
{
public:
    Employer emp;
    Node* link;
    Node(Employer e) : emp(e) { }
};
在本例中,我选择使用复制构造函数,您没有为
雇主
明确定义它,但它仍然存在。通常,您更愿意按常量引用获取参数:

Node::Node(Employer const & e) : emp(e), link(NULL) { }
您还可以提供其他构造函数,例如:

Node::Node(std::string const & s, int d) : emp(s, 12, d, 24), link(NULL) { }

(在构造函数主体中放入的越少越好。)

为初始值设定项列表中的
雇主
成员提供显式构造函数调用:

class Node
{
public:
    Employer emp;
    Node* link;
    Node(Employer e) : emp(e) { }
};
在本例中,我选择使用复制构造函数,您没有为
雇主
明确定义它,但它仍然存在。通常,您更愿意按常量引用获取参数:

Node::Node(Employer const & e) : emp(e), link(NULL) { }
您还可以提供其他构造函数,例如:

Node::Node(std::string const & s, int d) : emp(s, 12, d, 24), link(NULL) { }

(你在构造器主体中投入的越少越好。)

目前你默认构建
emp
成员(或尝试),然后将
雇主x
分配给它。即使您可以默认构造它,但如果您可以首先正确地设置它,那么这样做然后覆盖它将是浪费

使用


相反。这会立即为
emp
link
提供正确的值。

当前默认情况下,您正在构建
emp
成员(或尝试),然后将
雇主x
分配给它。即使您可以默认构造它,但如果您可以首先正确地设置它,那么这样做然后覆盖它将是浪费

使用


相反。这会立即为
emp
link
提供正确的值。

因为海报上说它们是编程新手,所以对正在发生的事情进行解释会很有用-请参见Kerrek SB的回答。是的,给出解释是一种有效的方法,但我也认为,给出一个提示并让OP做研究是另一种有效的方法。特别是如果海报是编程新手。如果我给我所用的东西命名,有什么真正有用的,但我不记得这些初始值设定者的正式名称;-)@MichaelKrelin hacker:也就是说,希望OP看到一个冒号,并知道她需要研究“构造函数初始值设定项列表”,这可能有点牵强……好吧,如果我命名了这个概念,我认为这个期望没有什么错。是的,我承认,如果我这样做了那就太好了,我很抱歉没有这样做。因为海报上说他们是编程新手,对正在发生的事情进行解释是很有用的——请参阅Kerrek SB的回答……是的,给出解释是一种有效的方法,但我也认为,给出一个提示并让OP做研究是另一种有效的方法。特别是如果海报是编程新手。如果我给我所用的东西命名,有什么真正有用的,但我不记得这些初始值设定者的正式名称;-)@MichaelKrelin hacker:也就是说,希望OP看到一个冒号,并知道她需要研究“构造函数初始值设定项列表”,这可能有点牵强……好吧,如果我命名了这个概念,我认为这个期望没有什么错。是的,我承认,如果我这么做了那就太好了,我很抱歉没有这么做。太好了!它起作用了!谢谢大家的回复!你真的帮了大忙而且…快得可笑!(顺便说一句,我还不确定为什么我应该通过引用而不仅仅是通过价值传递给雇主,我通过价值传递它,它是有效的,但我得到了关于通过价值传递而不是通过引用的警告,很明显……但它仍然有效,所以我很困惑……)太好了!它起作用了!谢谢大家的回复!你真的帮了大忙而且…快得可笑!(顺便说一句,我还不确定为什么我应该通过引用而不仅仅是通过价值传递给雇主,我通过价值传递它,它是有效的,但我得到了关于通过价值传递而不是通过引用的警告。显然……但它仍然有效,所以我很困惑。)