Node struct(C ++语法)没有合适的默认构造函数

时间:2009-08-20 04:09:34

标签: c++

没有错误

// list.h
//...
list::node::node(const winery &winery)
{
}
void list::insert(const winery& winery)
{
    //const char *Names = winery.getName();
    node *new_node = new node( winery );
}

添加list :: node :: node(const winery& winery)函数 到list.cpp文件可以分配节点。

然而,它迫使我向酒厂类添加一个dfault构造函数:

class winery
{
public :
    winery(const char * const name, const char * const location, 
const int acrces, const int rating);
    winery();
    virtual ~winery(void);
//...

从而havinvg提供默认ctor的正文。 有没有办法让它在没有声明和定义酒厂类的默认ctor的情况下工作?

3 个答案:

答案 0 :(得分:1)

鉴于上述代码,分配将为:

node* new_node = new node(winery);

然后通过分别迭代每个列表并正确设置指针来正确地将new_node插入到您的两个列表(名称和评级)中。

答案 1 :(得分:1)

我对这个问题有点困惑。为什么需要默认构造节点?使用提供的构造函数来获取酒庄。就像fbereton在他的回答中所说的那样。

node* aNode = new node(aWinery);

您需要使用节点指针(node*)而不是节点引用(node&),因为您将明确管理列表数据结构中的内存。此外,在插入函数

的开头将头指针设置为NULL不是一个好主意
 headByName   = NULL;
 headByRating = NULL;

您希望在构造函数中执行此操作。否则,每次插入时都会丢失列表中的节点。

但是你要描述的错误。如果你发布了你得到的错误,那真的会有所帮助,但听起来像节点(const winery&)构造函数没有在任何地方定义,并且链接器希望你定义它。听起来您认为不允许定义该构造函数,因为作业指令要求您使用定义的节点。但是,我认为指令可能意味着您只需要使用节点结构的给定头定义。也就是说,您将获得节点的规范,但您需要自己实现详细信息。

其中一个细节是构造函数实现。您无需修改​​标头来定义构造函数。在你的一个.cpp文件中(list.cpp,main.cpp,winery.cpp,无关紧要)定义以下函数

list::node::node(const winery& aWinery)
{
    item = aWinery;
    nextByName = NULL;
    nextByRating = NULL;
}

现在构造函数已定义,应解决链接错误。作为旁注,很多函数都有这个参数签名:const winery& winery。现在我不确切地知道C ++标准对此有何看法,但我认为拥有一个具有相同名称的变量和类型是违法的。即使您的编译器允许您这样做,也会让人感到困惑。

答案 2 :(得分:0)

指定酒厂,以便不需要默认构造函数:

选项1 :在其构造函数中为每个参数指定默认值:

winery(const char * const name = "",
       const char * const location = "", 
       const int acrces = -1,
       const int rating = -1);

请注意,如果您选择此路线,则必须添加支持代码以检查并确保winery的数据有效。

选项2 :另一个选择是消除需要默认构造函数的情况。要找到它/它们,将默认构造函数放在winery结构的private空间中,并查看编译器发出错误的位置。那些winery的实例需要有效的初始构造函数数据。