没有错误
// 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的情况下工作?
答案 0 :(得分:1)
鉴于上述代码,分配将为:
node* new_node = new node(winery);
然后通过分别迭代每个列表并正确设置指针来正确地将new_node
插入到您的两个列表(名称和评级)中。
答案 1 :(得分:1)
我对这个问题有点困惑。为什么需要默认构造节点?使用提供的构造函数来获取酒庄。就像fbereton在他的回答中所说的那样。
node* aNode = new node(aWinery);
您需要使用节点指针(node*
)而不是节点引用(node&
),因为您将明确管理列表数据结构中的内存。此外,在插入函数
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
的实例需要有效的初始构造函数数据。