如果对象没有默认构造函数并且我不允许在其类定义中创建一个对象,如何将对象放入节点中?
Posted
技术标签:
【中文标题】如果对象没有默认构造函数并且我不允许在其类定义中创建一个对象,如何将对象放入节点中?【英文标题】:How do I put an object in a node if the object has no default constructor and I am not allowed to create one inside its class definition? 【发布时间】:2011-11-30 13:23:47 【问题描述】:我想立即指出,我已经搜索过该网站,但没有发现类似的问题。 有人质疑无法将对象放入节点,但我的问题是:
我不能将对象放入节点中,并且不允许为对象创建默认构造函数(至少不能在其类定义中)
更具体地说:
我被分配了以下班雇主:
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;
如您所见,我想创建一个 Node 类,其中包含一个节点指针和一个对象 Employer。
很遗憾,这不起作用。我不断收到以下错误消息:
E2279: 找不到用于初始化成员的默认构造函数.....
基本上发生的情况是因为类 Employer 没有默认构造函数“Employer emp;”编译器无法“识别” Node 类中的“int n”而不是“Employer emp”。
所以我的问题是这样的:
如何将对象 Employer 放入节点而不更改/添加任何内容到类 Employer(即,我不能向类 Employer 添加默认构造函数,也不能添加“朋友类节点”之类的东西,规则我是否应该按原样离开班级雇主)
由于我是编程新手,我想补充一点,我还没有学习过模板,所以我不能使用任何模板,只能使用我已经给你的工具(类、函数、指针..等)
【问题讨论】:
【参考方案1】:为初始化列表中的Employer
成员提供显式构造函数调用:
class Node
public:
Employer emp;
Node* link;
Node(Employer e) : emp(e)
;
在此示例中,我选择使用 copy 构造函数,您没有为Employer
明确定义它,但无论如何它都存在。通常,您更愿意通过 const-reference 获取参数:
Node::Node(Employer const & e) : emp(e), link(NULL)
您还可以提供额外的构造函数,例如:
Node::Node(std::string const & s, int d) : emp(s, 12, d, 24), link(NULL)
(你在构造函数中放入的body越少越好。)
【讨论】:
太棒了!有用!感谢所有回复的人!你真的很有帮助,而且……快得离谱! (顺便说一句,我还不确定为什么我应该通过引用而不是通过值传递 Employer,我通过值传递它并且它有效,但是我收到关于通过值传递而不是通过引用传递的警告..但它仍然有效,所以我很困惑..)【参考方案2】:Node::Node(Employer x) : emp(x)
【讨论】:
由于发帖者说他们是编程新手,所以对正在发生的事情的解释会很有用 - 请参阅 Kerrek SB 的回答.. 是的,给出解释是一种有效的方法,但我也认为给出提示并让 OP 进行研究是另一种有效的方法。 特别是如果海报是编程新手。如果我为我使用的东西命名,那么真正有用的是什么,但我不记得这些初始化程序是如何正式命名的 ;-) @MichaelKrelin-hacker:也就是说,期望 OP 看到冒号并知道她需要研究“构造函数初始化列表”可能有点牵强... 嗯,如果我命名了这个概念,我认为期望没有错。是的,我承认,如果我这样做会很棒,我很抱歉没有这样做。【参考方案3】:目前,您正在默认构造 emp
成员(或尝试构造),然后将 Employer x
分配给它。即使您可以默认构建它,如果您一开始就可以正确设置它,那么这样做然后覆盖它也是浪费的。
使用
Node::Node(Employer x) : emp(x), link(NULL)
相反。这会立即为emp
和link
提供正确的值。
【讨论】:
以上是关于如果对象没有默认构造函数并且我不允许在其类定义中创建一个对象,如何将对象放入节点中?的主要内容,如果未能解决你的问题,请参考以下文章